#Область ОписаниеПеременных

&НаКлиенте
Перем УИ_ИдентификаторТекущейСтрокиЗапросов; //Число

&НаКлиенте
Перем УИ_РедакторКодаКлиентскиеДанные Экспорт;

&НаКлиенте
Перем УИ_ПараметрыПериодическогоИсполненияЗапроса; //см. НовыйПараметрыПериодическогоИсполненияЗапроса

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	НачальныйЗаголовок = Заголовок;

	ИнициализироватьФорму();

	УИ_РедакторКодаСервер.ФормаПриСозданииНаСервере(ЭтотОбъект, "Ace");
	УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
													   "ПЕРЕДВЫПОЛНЕНИЕМ",
													   Элементы.ДеревоЗапросовАлгоритмПередВыполнением);
	УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
													   "ПОСЛЕВЫПОЛНЕНИЯ",
													   Элементы.ПолеАлгоритмаПослеВыполнения);
	УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект,
													   "ТЕЛО",
													   Элементы.ТелоЗапроса,
													   ,
													   "json");

	Если Параметры.Свойство("ДанныеОтладки") Тогда
		//@skip-check unknown-form-parameter-access
		ЗаполнитьПоДаннымОтладки(Параметры.ДанныеОтладки);
	КонецЕсли;

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект,
															 Отказ,
															 СтандартнаяОбработка,
															 КоманднаяПанель);

КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОбновитьЗаголовок();
	УстановитьСтраницуРедактированияЗаголовковЗапроса();
	УИ_РедакторКодаКлиент.ФормаПриОткрытии(ЭтотОбъект);

	Если ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
		ЗагрузитьФайлКонсоли(Истина);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	Если Параметры.Свойство("ДанныеОтладки") Тогда
		ИмяФайлаЗапросов = "";
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

#Область ЗаголовкиЗапроса

&НаКлиенте
Процедура РедактированиеЗаголовковТаблицейПриИзменении(Элемент)
	УстановитьСтраницуРедактированияЗаголовковЗапроса();
КонецПроцедуры

#КонецОбласти


&НаКлиенте
Процедура КодировкаТелаЗапросаПриИзменении(Элемент)
	УстановитьЗаголовкиПоСодержимомуТелаЗапроса();
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЗапросовТипСтроковогоСодержимогоПриИзменении(Элемент)
	УстановитьЗаголовкиПоСодержимомуТелаЗапроса();
	УстановитьЯзыкРедактораТела(ТекущаяСтрокаЗапросов());
КонецПроцедуры

&НаКлиенте
Процедура ВидТелаЗапросаПриИзменении(Элемент)
	ПриИзмененииВидаТелаЗапроса();

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаТелаЗапросаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтрокаЗапроса = ТекущаяСтрокаЗапросов();	
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДВФ = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	ДВФ.МножественныйВыбор = Ложь;
	ДВФ.ПолноеИмяФайла = СтрокаЗапроса.ИмяФайлаТела;

	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ИдентификаторСтроки", СтрокаЗапроса.ПолучитьИдентификатор());

	ДВФ.Показать(Новый ОписаниеОповещения("ИмяФайлаТелаЗапросаНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОповещения));
КонецПроцедуры


&НаКлиенте
Процедура URLЗапросаПриИзменении(Элемент)
	УстановитьПредварительныйURL(ЭтотОбъект, УИ_ИдентификаторТекущейСтрокиЗапросов);
КонецПроцедуры

&НаКлиенте
Процедура ЗаголовкиСтрокаПриИзменении(Элемент)
	//ЗаполнитьСтруктуруJSONВДеревеЗапросов();
КонецПроцедуры


&НаКлиенте
Процедура ДеревоЗапросовАутентификацияВидПриИзменении(Элемент)
	ПриИзмененииВидаАутентификацииЗапроса();
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораДокументСформирован(Элемент)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLДокументСформирован(ЭтотОбъект, Элемент);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLПриНажатии(ЭтотОбъект, Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоЗапросов

&НаКлиенте
Процедура ДеревоЗапросовПриАктивизацииСтроки(Элемент)
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса <> Неопределено Тогда
		Если УИ_ПараметрыПериодическогоИсполненияЗапроса.СтрокаЗапросов <> Элементы.ДеревоЗапросов.ТекущаяСтрока Тогда
			ЗавершитьПериодическоеИсполнениеЗапроса();
		КонецЕсли;
	КонецЕсли;
	ПодключитьОбработчикОжидания("ОбработчикОжиданияАктивизацииСтрокиДереваЗапросов", 0.1, Истина);
	
КонецПроцедуры


&НаКлиенте
Процедура ДеревоЗапросовПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;
	Если Копирование Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные = Элементы.ДеревоЗапросов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИнициализироватьСтрокуДереваЗапросов(ТекДанные, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЗапросовПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;	
	
	ТекДанные = Элементы.ДеревоЗапросов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ТекДанные.Имя) Тогда
		Отказ = Истина;
	КонецЕсли;

КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаЗаголовковЗапроса


&НаКлиенте
Процедура ТаблицаЗаголовковЗапросаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;
	Если Копирование Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные = Элементы.ТаблицаЗаголовковЗапроса.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные.Использование = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаЗаголовковЗапросаПриИзменении(Элемент)
	//ЗаполнитьСтруктуруJSONВДеревеЗапросов();
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаЗаголовковЗапросаКлючАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание,
	СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	Если Не ЗначениеЗаполнено(Текст) Тогда
		Возврат;
	КонецЕсли;

	ДанныеВыбора = Новый СписокЗначений;

	Для Каждого ЭлементСписка Из СписокИспользованныхЗаголовков Цикл
		Если СтрНайти(НРег(ЭлементСписка.Значение), НРег(Текст)) > 0 Тогда
			ДанныеВыбора.Добавить(ЭлементСписка.Значение);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоЗапросовТелоМультипарт
&НаКлиенте
Процедура ДеревоЗапросовТелоМультипартПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;
	Если Копирование Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные = Элементы.ДеревоЗапросовТелоМультипарт.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанные.Использование = Истина;
	ТекДанные.Вид = ВидыЭлементовМультипарт().Файл;
КонецПроцедуры

&НаКлиенте
Процедура ДеревоЗапросовТелоМультипартЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.ДеревоЗапросовТелоМультипарт.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Виды = ВидыЭлементовМультипарт();
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ИдентификаторСтрокиЗапросов", УИ_ИдентификаторТекущейСтрокиЗапросов);
	ПараметрыОповещения.Вставить("ИдентификаторСтрокиТела", ТекДанные.ПолучитьИдентификатор());

	ОписаниеОповещенияОЗавершении = Новый ОписаниеОповещения("ДеревоЗапросовТелоМультипартЗначениеНачалоВыбораЗавершениеВыбора",
		ЭтотОбъект, ПараметрыОповещения);

	Если ТекДанные.Вид = Виды.Файл Тогда
		ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
		ДиалогВыбора.ПроверятьСуществованиеФайла = Истина;
		ДиалогВыбора.МножественныйВыбор = Ложь;
		ДиалогВыбора.Показать(Новый ОписаниеОповещения("ДеревоЗапросовТелоМультипартЗначениеНачалоВыбораЗавершениеВыбораФайла",
			ЭтотОбъект, Новый Структура("ОписаниеОЗавершении", ОписаниеОповещенияОЗавершении)));
	Иначе
		УИ_ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияТекста(ТекДанные.Значение, ОписаниеОповещенияОЗавершении);
	КонецЕсли;
КонецПроцедуры



#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыПараметрыURL

&НаКлиенте
Процедура ПараметрыURLПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;

	Если Копирование Тогда
		Возврат;
	КонецЕсли;
	ТекДанные = Элементы.ПараметрыURL.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные.Использование = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗапросаПриИзменении(Элемент)
	УстановитьПредварительныйURL(ЭтотОбъект, УИ_ИдентификаторТекущейСтрокиЗапросов);
КонецПроцедуры


#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыНаборыЗначенийПеременных
&НаКлиенте
Процедура НаборыЗначенийПеременныхПриАктивизацииСтроки(Элемент)
	Если ТекущийНаборЗначенийПеременных = Элементы.НаборыЗначенийПеременных.ТекущаяСтрока Тогда
		ВозвраТ;
	КонецЕсли;
	СохранитьЗначенияПеременныхВТекущийНаборДанных();
	ТекущийНаборЗначенийПеременных = Элементы.НаборыЗначенийПеременных.ТекущаяСтрока;
	ПриИзмененииТекущегоНабораПеременных(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура НаборыЗначенийПеременныхПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если Не НоваяСтрока Тогда
		Возврат;
	КонецЕсли;
	Если Копирование Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные = Элементы.НаборыЗначенийПеременных.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ИнициализироватьСтрокуНаборПеременных(ТекДанные, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура НаборыЗначенийПеременныхПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;	
	
	ТекДанные = Элементы.НаборыЗначенийПеременных.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ТекДанные.Имя) Тогда
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыПеременные
&НаКлиенте
Процедура ПеременныеПриИзменении(Элемент)
	УстановитьПредварительныйURL(ЭтотОбъект, УИ_ИдентификаторТекущейСтрокиЗапросов);
КонецПроцедуры
#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ДеревоЗапросовПереместитьНаУровеньВверх(Команда)
	
	Строка = ДеревоЗапросов.НайтиПоИдентификатору(Элементы.ДеревоЗапросов.ТекущаяСтрока);
	Родитель = Строка.ПолучитьРодителя();

	Если Родитель <> Неопределено Тогда
		РодительРодителя = Родитель.ПолучитьРодителя();
		Если РодительРодителя = Неопределено Тогда
			ИндексВставки = ДеревоЗапросов.ПолучитьЭлементы().Индекс(Родитель) + 1;
		Иначе
			ИндексВставки = РодительРодителя.ПолучитьЭлементы().Индекс(Родитель) + 1;
		КонецЕсли;
		
		НоваяСтрока = ПереместитьСтрокуДерева(ДеревоЗапросов, Строка, ИндексВставки, РодительРодителя);
		
		Элементы.ДеревоЗапросов.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	КонецЕсли;

	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапрос(Команда)
	ОбработчикВыполненияЗапроса();
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДвоичныеДанныеТелаИзФайла(Команда)
	Если УИ_ИдентификаторТекущейСтрокиЗапросов = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОповещения = Новый Структура();
	ПараметрыОповещения.Вставить("ИдентификаторТекущейСтроки", УИ_ИдентификаторТекущейСтрокиЗапросов);
	
	НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗаполнитьДвоичныеДанныеТелаИзФайлаЗавершение", ЭтотОбъект,
		ПараметрыОповещения), , "", Истина, УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьДвоичныеДанныеТелаЗапросаИзИстории(Команда)
	ТекДанныеИсторииЗапроса = Элементы.ИсторияЗапросов.ТекущиеДанные;
	Если ТекДанныеИсторииЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Не ЭтоАдресВременногоХранилища(ТекДанныеИсторииЗапроса.ТелоЗапросаАдресДвоичныхДанных) Тогда
		Возврат;
	КонецЕсли;

	ДВФ = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДВФ.МножественныйВыбор = Ложь;

	ПараметрыСохранения = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыСохраненияФайла();
	ПараметрыСохранения.ДиалогВыбораФайла = ДВФ;
	ПараметрыСохранения.АдресФайлаВоВременномХранилище = ТекДанныеИсторииЗапроса.ТелоЗапросаАдресДвоичныхДанных;
	УИ_ОбщегоНазначенияКлиент.НачатьСохранениеФайла(ПараметрыСохранения);

КонецПроцедуры

&НаКлиенте
Процедура СохранитьТелоОтветаДвоичныеДанныеВФайл(Команда)
	ТекДанныеИсторииЗапроса = Элементы.ИсторияЗапросов.ТекущиеДанные;
	Если ТекДанныеИсторииЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Не ЭтоАдресВременногоХранилища(ТекДанныеИсторииЗапроса.ТелоОтветаАдресДвоичныхДанных) Тогда
		Возврат;
	КонецЕсли;

	ДВФ = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДВФ.МножественныйВыбор = Ложь;

	ПараметрыСохранения = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыСохраненияФайла();
	ПараметрыСохранения.ДиалогВыбораФайла = ДВФ;
	ПараметрыСохранения.АдресФайлаВоВременномХранилище = ТекДанныеИсторииЗапроса.ТелоОтветаАдресДвоичныхДанных;
	УИ_ОбщегоНазначенияКлиент.НачатьСохранениеФайла(ПараметрыСохранения);

КонецПроцедуры

&НаКлиенте
Процедура ПодробнаяИнформацияПоЗаписиИсторииЗапроса(Команда)
	СтрокаЗапроса = ТекущаяСтрокаЗапросов();
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекДанные = Элементы.ДеревоЗапросовИсторияЗапросов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("СтрокаЗапроса", СтрокаЗапроса.ПолучитьИдентификатор());
	ПараметрыФормы.Вставить("СтрокаИстории", ТекДанные.ПолучитьИдентификатор());

	ОткрытьФорму("Обработка.УИ_КонсольHTTPЗапросов.Форма.ФормаПодробнойИнформацииОЗапросе",
				 ПараметрыФормы,
				 ЭтотОбъект,
				 ""
				 + УникальныйИдентификатор
				 + СтрокаЗапроса.ПолучитьИдентификатор()
				 + ТекДанные.ПолучитьИдентификатор());
КонецПроцедуры


&НаКлиенте
Процедура СохранитьДвоичныеДанныеТелаОтвета(Команда)
	Если Не ЭтоАдресВременногоХранилища(ТелоОтветаАдресДвоичныхДанных) Тогда
		Возврат;
	КонецЕсли;

	ДВФ = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	ДВФ.МножественныйВыбор = Ложь;

	ПараметрыСохранения = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыСохраненияФайла();
	ПараметрыСохранения.ДиалогВыбораФайла = ДВФ;
	ПараметрыСохранения.АдресФайлаВоВременномХранилище = ТелоОтветаАдресДвоичныхДанных;
	УИ_ОбщегоНазначенияКлиент.НачатьСохранениеФайла(ПараметрыСохранения);
КонецПроцедуры

&НаКлиенте
Процедура НовыйФайлЗапросов(Команда)
	Если ДеревоЗапросов.ПолучитьЭлементы().Количество() = 0 Тогда
		ИнициализироватьКонсоль();
	Иначе
		ПоказатьВопрос(Новый ОписаниеОповещения("НовыйФайлЗапросовЗавершение", ЭтотОбъект),
			"Дерево запросов непустое. Продолжить?", РежимДиалогаВопрос.ДаНет, 15, КодВозвратаДиалога.Нет);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФайлЗапросов(Команда)
	Если ДеревоЗапросов.ПолучитьЭлементы().Количество() = 0 Тогда
		ЗагрузитьФайлКонсоли();
	Иначе
		ПоказатьВопрос(Новый ОписаниеОповещения("ОткрытьФайлОтчетовЗавершение", ЭтотОбъект),
			"Дерево запросов непустое. Продолжить?", РежимДиалогаВопрос.ДаНет, 15, КодВозвратаДиалога.Нет);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьЗапросыВФайл(Команда)
	ВыполнитьСохранениеЗапросовВФайл();
КонецПроцедуры

&НаКлиенте
Процедура СохранитьЗапросыВФайлКак(Команда)
	ВыполнитьСохранениеЗапросовВФайл(Истина);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьТелоЗапросаВРедактореJSON(Команда)
	СтрокаДерева = ТекущаяСтрокаЗапросов();
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СохранитьДанныеЗапросаВДеревоЗапросов();
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ТекущаяСтрока", СтрокаДерева.ПолучитьИдентификатор());

	УИ_ОбщегоНазначенияКлиент.РедактироватьJSON(СтрокаДерева.ТелоСтрокой,
												Ложь,
												Новый ОписаниеОповещения("РедактироватьТелоЗапросаВРедактореJSONЗавершение",
		ЭтотОбъект, ПараметрыОповещения));
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьТелоЗапросаВРедактореJSONАнализируемогоЗапроса(Команда)
	УИ_ОбщегоНазначенияКлиент.РедактироватьJSON(Элементы.ИсторияЗапросов.ТекущиеДанные.ТелоЗапросаСтрока, Истина);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьТелоОтветаВРедактореJSONАнализируемогоЗапроса(Команда)
	УИ_ОбщегоНазначенияКлиент.РедактироватьJSON(ТелоОтветаСтрокой, Истина);
КонецПроцедуры

&НаКлиенте
Процедура СкопироватьДанныеСтрокиИсторииВЗапрос(Команда)
	СтрокаЗапроса = ТекущаяСтрокаЗапросов();
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаИстории = Элементы.ДеревоЗапросовИсторияЗапросов.ТекущиеДанные;
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СкопироватьДанныеСтрокиИсторииВЗапросНаСервере(СтрокаЗапроса.ПолучитьИдентификатор(),
												   СтрокаИстории.ПолучитьИдентификатор());
	ИзвлечьДанныеЗапросаИзСтрокиДерева();
КонецПроцедуры

&НаКлиенте
Процедура СгенерироватьКодИсполнения(Команда)
	ТекДанные = Элементы.ДеревоЗапросов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	СохранитьДанныеЗапросаВДеревоЗапросов();
	СохранитьЗначенияПеременныхВТекущийНаборДанных();
	
	СгенерированныйКод = СгенерированныйКодИсполненияНаСервере(ТекДанные.ПолучитьИдентификатор());

	УИ_ОбщегоНазначенияКлиент.ОткрытьСтрокуКодаВСпециальнойФорме(СгенерированныйКод, "HTTP запрос: " + ТекДанные.Имя, ""
																													  + УникальныйИдентификатор
																													  + ТекДанные.ПолучитьИдентификатор());
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуРедактораКода(Команда)
	УИ_РедакторКодаКлиент.ВыполнитьКомандуРедактораКода(ЭтотОбъект, Команда);
КонецПроцедуры

&НаКлиенте
Процедура Импорт(Команда)
	
	ПараметрыВыбораНастроек = ПараметрыВыбораНастроекИмпорта();
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ПараметрыВыбораНастроек", ПараметрыВыбораНастроек);

	УИ_ОбщегоНазначенияКлиент.НачатьВыборНастроекИмпортаДляИнструмента(ПараметрыВыбораНастроек,
																	   Новый ОписаниеОповещения("ИмпортЗавершениеВыбораНастроекИмпорта",
		ЭтотОбъект, ПараметрыОповещения),
																	   ЭтотОбъект);
КонецПроцедуры


&НаКлиенте
Процедура ВыполнитьЗапросСЗадержкой(Команда)
	ПоказатьВводЧисла(Новый ОписаниеОповещения("ВыполнитьЗапросСЗадержкойЗавершениеВводаЗадержки", ЭтотОбъект),
					  0,
					  "Введите задержку выполнения",
					  10,
					  1);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСПериодичностью(Команда)
	ПоказатьВводЧисла(Новый ОписаниеОповещения("ВыполнитьСПериодичностьюЗавершениеВводаПериодичности", ЭтотОбъект),
					  0,
					  "Введите периодичность выполнения",
					  10,
					  1);
КонецПроцедуры


&НаКлиенте
Процедура ОстановитьПериодическоеВыполенение(Команда)
	ЗавершитьПериодическоеИсполнениеЗапроса();
КонецПроцедуры
#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область Импорт

// Импорт завершение выбора настроек импорта.
// 
// Параметры:
//  Результат - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйРезультатНастроекИмпорта
//  ДополнительныеПараметры - Структура:
//  	* ПараметрыВыбораНастроек - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйПараметрыИмпортаИнструмента
&НаКлиенте
Процедура ИмпортЗавершениеВыбораНастроекИмпорта(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИмпортироватьДанныеИмпортаНаСервере(Результат);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыВыбораНастроекИмпорта()
	ПараметрыИмпорта = УИ_ОбщегоНазначенияКлиентСервер.НовыйПараметрыИмпортаИнструмента();
	ПараметрыИмпорта.ПрочитатьФайлВоВременноеХранилище = Истина;
	
	ВариантыСодержимого = УИ_ОбщегоНазначенияКлиентСервер.ВариантыСодержимогоДляИмпорта();
	
	НовыйФормат = УИ_ОбщегоНазначенияКлиентСервер.НовыйФорматИмпортаИнструмента();
	НовыйФормат.Идентификатор = "Инсомния4";
	НовыйФормат.Представление = "Insomnia (v4)";
	НовыйФормат.ВариантСодержимого = ВариантыСодержимого.Файл;
	НовыйФормат.ФильтрФайловДляДиалога = "Файл JSON|*.json";
	ПараметрыИмпорта.Форматы.Добавить(НовыйФормат);

	НовыйФормат = УИ_ОбщегоНазначенияКлиентСервер.НовыйФорматИмпортаИнструмента();
	НовыйФормат.Идентификатор = "ПостманКоллекции21";
	НовыйФормат.Представление = "Postman. Коллекции (v2.1)";
	НовыйФормат.ВариантСодержимого = ВариантыСодержимого.Файл;
	НовыйФормат.ФильтрФайловДляДиалога = "Файл JSON|*.json";
	ПараметрыИмпорта.Форматы.Добавить(НовыйФормат);

	НовыйФормат = УИ_ОбщегоНазначенияКлиентСервер.НовыйФорматИмпортаИнструмента();
	НовыйФормат.Идентификатор = "ПостманПеременные";
	НовыйФормат.Представление = "Postman. Environments";
	НовыйФормат.ВариантСодержимого = ВариантыСодержимого.Файл;
	НовыйФормат.ФильтрФайловДляДиалога = "Файл JSON|*.json";
	ПараметрыИмпорта.Форматы.Добавить(НовыйФормат);

	
//	НовыйФормат = УИ_ОбщегоНазначенияКлиентСервер.НовыйФорматИмпортаИнструмента();
//	НовыйФормат.Идентификатор = "curl";
//	НовыйФормат.Представление = "curl";
//	НовыйФормат.ВариантСодержимого = ВариантыСодержимого.Строка;
//	ПараметрыИмпорта.Форматы.Добавить(НовыйФормат);


	
	Возврат ПараметрыИмпорта;
КонецФункции


// Прочитать данные импорта.
// 
// Параметры:
//  ДанныеИмпорта - см. УИ_ОбщегоНазначенияКлиентСервер.НовыйРезультатНастроекИмпорта
&НаСервере
Процедура ИмпортироватьДанныеИмпортаНаСервере(ДанныеИмпорта)
	СодержимоеФайла = СодержимоеФайлаИмпорта(ДанныеИмпорта);
	Если СодержимоеФайла = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	
	Если ДанныеИмпорта.ОчиститьДанныеИнструментаПередЗаполнением Тогда
		ДеревоЗапросов.ПолучитьЭлементы().Очистить();
		Переменные.Очистить();
		НаборыЗначенийПеременных.Очистить();
	КонецЕсли;
	
	Если ДанныеИмпорта.Формат.Идентификатор = "Инсомния4" Тогда
		ИмпортироватьДанныеИнсомнии4(СодержимоеФайла);
	ИначеЕсли ДанныеИмпорта.Формат.Идентификатор = "curl" Тогда 
		ИмпортироватьДанныеCurl(СодержимоеФайла);
	ИначеЕсли ДанныеИмпорта.Формат.Идентификатор = "ПостманКоллекции21" Тогда 
		ИмпортироватьДанныеPostmanКоллекции21(СодержимоеФайла);
	ИначеЕсли ДанныеИмпорта.Формат.Идентификатор = "ПостманПеременные" Тогда 
		ИмпортироватьДанныеPostmanПеременные(СодержимоеФайла);
	КонецЕсли;
	
	Если ДеревоЗапросов.ПолучитьЭлементы().Количество() = 0 Тогда
		ИнициализироватьДеревоЗапросов();
	КонецЕсли;
	Если НаборыЗначенийПеременных.Количество() = 0 Тогда
		ИнициализироватьТаблицыПеременных();
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция СодержимоеФайлаИмпорта(ДанныеИмпорта)
	ДанныеФайла = ПолучитьИзВременногоХранилища(ДанныеИмпорта.Содержимое);//ДвоичныеДанные
	Если ТипЗнч(ДанныеФайла) <> Тип("ДвоичныеДанные") Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось прочитать файл импорта");
		Возврат Неопределено;
	КонецЕсли;

	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.Прочитать(ДанныеФайла.ОткрытьПотокДляЧтения(), КодировкаТекста.UTF8);

	Попытка
		СодержимоеФайла = УИ_ОбщегоНазначенияКлиентСервер.мПрочитатьJSON(ТекстовыйДокумент.ПолучитьТекст(), Истина);//Структура
	Исключение
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Содержимое файла не является JSON " + ОписаниеОшибки());
		Возврат Неопределено;
	КонецПопытки;

	Возврат СодержимоеФайла;
КонецФункции


#Область Инсомния

&НаСервере
Функция Инсомния4СтрокаСПреобразованнымиПеременными(СтрокаКПреобразованию)
	Если СтрНайти(СтрокаКПреобразованию, "{{") = 0 Или СтрНайти(СтрокаКПреобразованию, "}}") = 0 Тогда
		Возврат СтрокаКПреобразованию;
	КонецЕсли;

	СтрокаВозврата = СтрокаКПреобразованию;
	Для Каждого ТекСтр Из Переменные Цикл
		Если Не ЗначениеЗаполнено(ТекСтр.Имя) Тогда
			Продолжить;
		КонецЕсли;
		СтрокаВозврата = СтрЗаменить(СтрокаВозврата, "{{ " + ТекСтр.Имя + " }}", "{{" + ТекСтр.Имя + "}}");
		СтрокаВозврата = СтрЗаменить(СтрокаВозврата, "{{ _." + ТекСтр.Имя + " }}", "{{" + ТекСтр.Имя + "}}");
		СтрокаВозврата = СтрЗаменить(СтрокаВозврата, "{{_." + ТекСтр.Имя + "}}", "{{" + ТекСтр.Имя + "}}");
	КонецЦикла;
	
	Возврат СтрокаВозврата;
КонецФункции

&НаСервере
Процедура Инсомния4ИмпортироватьНаборЗначенийПеременных(ДанныеНабораФайла)
	НоваяСтрокаНабора = НаборыЗначенийПеременных.Добавить();
	НоваяСтрокаНабора.Имя = ДанныеНабораФайла["name"];
	
	Для Каждого КлючЗначение Из ДанныеНабораФайла["data"] Цикл
		НоваяПеременнаяНабора = НоваяСтрокаНабора.Переменные.Добавить();
		НоваяПеременнаяНабора.Имя = КлючЗначение.Ключ;
		НоваяПеременнаяНабора.Значение = КлючЗначение.Значение;
		
		ДобавитьПеременнуюПриНеобходимости(НоваяПеременнаяНабора.Имя);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура Инсомния4ЗаполнитьДеревоЗапросовПоТаблицеРесурсов(СтрокаДерева, ТаблицаРесурсов, ИдентификаторРодителя)
	СтруктураПоиска = Новый Структура;
	СтруктураПоиска.Вставить("Родитель", ИдентификаторРодителя);

	ВидыТела= ВидыТелаЗапроса();
	ВидыЭлементовМультипарт = ВидыЭлементовМультипарт();
	ВидыАутентификации = ВидыАутентификации();
	
	НайденныеСтрокиРесурсов = ТаблицаРесурсов.НайтиСтроки(СтруктураПоиска);
	Для Каждого Стр Из НайденныеСтрокиРесурсов Цикл
		НоваяСтрокаДерева = СтрокаДерева.ПолучитьЭлементы().Добавить();
		ИнициализироватьСтрокуДереваЗапросов(НоваяСтрокаДерева, ЭтотОбъект);
		НоваяСтрокаДерева.Имя = Стр.ДанныеРесурса["name"];
		НоваяСтрокаДерева.Комментарий = Стр.ДанныеРесурса["description"];
		
		Если Стр.ТипРесурса = "request" Тогда
			НоваяСтрокаДерева.URLЗапроса = Инсомния4СтрокаСПреобразованнымиПеременными(Стр.ДанныеРесурса["url"]);
			НоваяСтрокаДерева.ЗапросHTTP = ВРег(Стр.ДанныеРесурса["method"]);
			
			Для Каждого ТекЗаголовок Из Стр.ДанныеРесурса["headers"] Цикл
				НоваяСтрокаЗаголовка = НоваяСтрокаДерева.Заголовки.Добавить();
				НоваяСтрокаЗаголовка.Ключ = Инсомния4СтрокаСПреобразованнымиПеременными(ТекЗаголовок["name"]);
				НоваяСтрокаЗаголовка.Значение = Инсомния4СтрокаСПреобразованнымиПеременными(ТекЗаголовок["value"]);
				НоваяСтрокаЗаголовка.Использование = ТекЗаголовок["disabled"] <> Истина;
			КонецЦикла;
		
			Для Каждого ТекПараметрURL Из Стр.ДанныеРесурса["parameters"] Цикл
				НоваяСтрокаПараметра = НоваяСтрокаДерева.ПараметрыURL.Добавить();
				НоваяСтрокаПараметра.Имя = Инсомния4СтрокаСПреобразованнымиПеременными(ТекПараметрURL["name"]);
				НоваяСтрокаПараметра.Значение = Инсомния4СтрокаСПреобразованнымиПеременными(ТекПараметрURL["value"]);
				НоваяСтрокаПараметра.Использование = ТекПараметрURL["disabled"] <> Истина;
			КонецЦикла;
			
			//аутентификация
			АутентификацияЗапроса = Стр.ДанныеРесурса["authentication"];
			Если АутентификацияЗапроса <> Неопределено Тогда

				ТипАутентификации = АутентификацияЗапроса["type"];
				Если ТипАутентификации = "bearer" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.BearerToken;
					НоваяСтрокаДерева.АутентификацияПароль = Инсомния4СтрокаСПреобразованнымиПеременными(АутентификацияЗапроса["token"]);
					НоваяСтрокаДерева.АутентификацияПрефиксТокена = Инсомния4СтрокаСПреобразованнымиПеременными(АутентификацияЗапроса["prefix"]);
					НоваяСтрокаДерева.АутентификацияИспользовать = АутентификацияЗапроса["disabled"] <> Истина;
				ИначеЕсли ТипАутентификации = "basic" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.Базовая;
					НоваяСтрокаДерева.АутентификацияПароль = Инсомния4СтрокаСПреобразованнымиПеременными(АутентификацияЗапроса["password"]);
					НоваяСтрокаДерева.АутентификацияПользователь = Инсомния4СтрокаСПреобразованнымиПеременными(АутентификацияЗапроса["username"]);
					НоваяСтрокаДерева.АутентификацияИспользовать = АутентификацияЗапроса["disabled"] <> Истина;
				ИначеЕсли ТипАутентификации = "ntlm" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.NTML;
					НоваяСтрокаДерева.АутентификацияИспользовать = АутентификацияЗапроса["disabled"] <> Истина;
				КонецЕсли;
			КонецЕсли;

			
			ТелоЗапроса = Стр.ДанныеРесурса["body"];
			Если ТелоЗапроса <> Неопределено Тогда
				ТипТела = ТелоЗапроса["mimeType"];
				
				Если ТипТела = "multipart/form-data" Тогда
					НоваяСтрокаДерева.ВидТела = ВидыТела.МультипартФорм;
					Для Каждого ЧастьТела Из ТелоЗапроса["params"] Цикл
						НоваяСтрокаМультипарт = НоваяСтрокаДерева.ТелоМультипарт.Добавить();
						НоваяСтрокаМультипарт.Использование = ЧастьТела["disabled"] <> Истина;
						НоваяСтрокаМультипарт.Имя = Инсомния4СтрокаСПреобразованнымиПеременными(ЧастьТела["name"]);
						
						Если ЧастьТела["type"] = "file" Тогда
							НоваяСтрокаМультипарт.Вид = ВидыЭлементовМультипарт.Файл;
							НоваяСтрокаМультипарт.Значение = ЧастьТела["fileName"];
						Иначе
							НоваяСтрокаМультипарт.Вид = ВидыЭлементовМультипарт.Строка;
							НоваяСтрокаМультипарт.Значение = ЧастьТела["value"];
						КонецЕсли;
					КонецЦикла;
				ИначеЕсли ТипТела = "application/octet-stream" И ТипЗнч(ТелоЗапроса["fileName"])=Тип("Строка") Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Файл;
					НоваяСтрокаДерева.ИмяФайлаТела = ТелоЗапроса["fileName"];
				ИначеЕсли ТипТела = "application/x-www-form-urlencoded" Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					
					СтрокиУРЛТела = Новый Массив;
					//TODO Переделать на новый вид тела когда тот появится
					Для Каждого ЧастьТела Из ТелоЗапроса["params"] Цикл
						Если ЧастьТела["disabled"] = Истина Тогда
							Продолжить;
						КонецЕсли;
						
						ИмяПараметра = КодироватьСтроку(Инсомния4СтрокаСПреобразованнымиПеременными(ЧастьТела["name"]),
														СпособКодированияСтроки.КодировкаURL);
						ЗначениеПараметра = КодироватьСтроку(Инсомния4СтрокаСПреобразованнымиПеременными(ЧастьТела["value"]),
															 СпособКодированияСтроки.КодировкаURL);

						СтрокиУРЛТела.Добавить(ИмяПараметра + "=" + ЗначениеПараметра);
					КонецЦикла;
					
					НоваяСтрокаДерева.ТелоСтрокой = СтрСоединить(СтрокиУРЛТела,"&");
				ИначеЕсли ТипТела = "application/json" Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					НоваяСтрокаДерева.ТипСтроковогоСодержимого ="json";
					НоваяСтрокаДерева.ТелоСтрокой = Инсомния4СтрокаСПреобразованнымиПеременными(ТелоЗапроса["text"]);					
				ИначеЕсли ТипТела = "application/xml" Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					НоваяСтрокаДерева.ТипСтроковогоСодержимого = "xml";
					НоваяСтрокаДерева.ТелоСтрокой = Инсомния4СтрокаСПреобразованнымиПеременными(ТелоЗапроса["text"]);					
				ИначеЕсли ТипТела = "application/yaml" Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					НоваяСтрокаДерева.ТипСтроковогоСодержимого = "yaml";
					НоваяСтрокаДерева.ТелоСтрокой = Инсомния4СтрокаСПреобразованнымиПеременными(ТелоЗапроса["text"]);
				ИначеЕсли ТипТела = Неопределено Тогда
				ИначеЕсли ТипЗнч(ТелоЗапроса["text"]) = Тип("Строка") Тогда 
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					НоваяСтрокаДерева.ТелоСтрокой = Инсомния4СтрокаСПреобразованнымиПеременными(ТелоЗапроса["text"]);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		
		Инсомния4ЗаполнитьДеревоЗапросовПоТаблицеРесурсов(НоваяСтрокаДерева, ТаблицаРесурсов, Стр.Идентификатор);	
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ИмпортироватьДанныеИнсомнии4(СодержимоеФайла)
	
	ТаблицаРесурсов = Новый ТаблицаЗначений;
	ТаблицаРесурсов.Колонки.Добавить("Идентификатор");
	ТаблицаРесурсов.Колонки.Добавить("ДанныеРесурса");
	ТаблицаРесурсов.Колонки.Добавить("Родитель");
	ТаблицаРесурсов.Колонки.Добавить("ТипРесурса");

	Для Каждого ТекСтр Из СодержимоеФайла["resources"] Цикл
		ТипРесурса = ТекСтр["_type"];
		ИдентификаторРесурса = ТекСтр["_id"];
		РодительРесурса = ТекСтр["parentId"];
		Если РодительРесурса = Null Тогда
			РодительРесурса = Неопределено;
		КонецЕсли;

		Если ТипРесурса = "environment" Тогда
			Инсомния4ИмпортироватьНаборЗначенийПеременных(ТекСтр);
			Продолжить;
		ИначеЕсли ТипРесурса <> "workspace" И ТипРесурса <> "request_group" И ТипРесурса <> "request" Тогда
			Продолжить;
		КонецЕсли;

		НоваяСтрока = ТаблицаРесурсов.Добавить();
		НоваяСтрока.Идентификатор = ИдентификаторРесурса;
		НоваяСтрока.Родитель = РодительРесурса;
		НоваяСтрока.ДанныеРесурса = ТекСтр;
		НоваяСтрока.ТипРесурса = ТипРесурса;
	КонецЦикла;
	
	Инсомния4ЗаполнитьДеревоЗапросовПоТаблицеРесурсов(ДеревоЗапросов, ТаблицаРесурсов, Неопределено);

КонецПроцедуры

#КонецОбласти

#Область CURL

&НаСервере
Процедура ИмпортироватьДанныеCurl(СодержимоеФайла)
	
КонецПроцедуры

#КонецОбласти

#Область Postman

&НаСервере
Процедура ИмпортироватьДанныеPostmanПеременные(СодержимоеФайла)
	Если СодержимоеФайла["_postman_variable_scope"] <> "environment" Тогда
		Возврат;
	КонецЕсли;
		
	НовыйНабор = НаборыЗначенийПеременных.Добавить();
	НовыйНабор.Имя = СодержимоеФайла["name"];
	
	Для Каждого Стр Из СодержимоеФайла["values"] Цикл
		НоваяПеременнаяНабора = НовыйНабор.Переменные.Добавить();
		НоваяПеременнаяНабора.Имя = Стр["key"];
		НоваяПеременнаяНабора.Значение = Стр["value"];
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ИмпортироватьЭлементыКоллекцииPostmanКоллекции21(СтрокаДерева, ЭлементыСодержимого)
	Если ЭлементыСодержимого = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;

	ВидыТела= ВидыТелаЗапроса();
	ВидыЭлементовМультипарт = ВидыЭлементовМультипарт();
	ВидыАутентификации = ВидыАутентификации();

	ЭлементыДерева = СтрокаДерева.ПолучитьЭлементы();
	
	Для Каждого ТекЭлементСодержимого Из ЭлементыСодержимого Цикл
		НоваяСтрокаДерева = ЭлементыДерева.Добавить();
		ИнициализироватьСтрокуДереваЗапросов(НоваяСтрокаДерева, ЭтотОбъект);
		НоваяСтрокаДерева.Имя = ТекЭлементСодержимого["name"];
		НоваяСтрокаДерева.Комментарий = ТекЭлементСодержимого["description"];
		
		ДанныеЗапроса = ТекЭлементСодержимого["request"];
		Если ДанныеЗапроса <> Неопределено Тогда
			Данныеurl = ДанныеЗапроса["url"];
			Если Данныеurl <> Неопределено Тогда
				НоваяСтрокаДерева.URLЗапроса = Данныеurl["raw"];
				
				ДанныеПараметровURL = Данныеurl["query"];
				Если ДанныеПараметровURL <> Неопределено Тогда
					Для Каждого ТекПараметрURL Из ДанныеПараметровURL Цикл
						НоваяСтрокаПараметра = НоваяСтрокаДерева.ПараметрыURL.Добавить();
						НоваяСтрокаПараметра.Имя = ТекПараметрURL["key"];
						НоваяСтрокаПараметра.Значение = ТекПараметрURL["value"];
						НоваяСтрокаПараметра.Использование = ТекПараметрURL["disabled"] <> Истина;
					КонецЦикла;

				КонецЕсли;
			КонецЕсли;
			НоваяСтрокаДерева.ЗапросHTTP = ВРег(ДанныеЗапроса["method"]);

			ДанныеЗаголовков = ДанныеЗапроса["header"];
			Если ДанныеЗаголовков <> Неопределено Тогда
				Для Каждого ТекЗаголовок Из ДанныеЗаголовков Цикл
					НоваяСтрокаЗаголовка = НоваяСтрокаДерева.Заголовки.Добавить();
					НоваяСтрокаЗаголовка.Ключ = ТекЗаголовок["key"];
					НоваяСтрокаЗаголовка.Значение = ТекЗаголовок["value"];
					НоваяСтрокаЗаголовка.Использование = ТекЗаголовок["disabled"] <> Истина;
				КонецЦикла;
			КонецЕсли;

			АутентификацияЗапроса = ДанныеЗапроса["auth"];
			Если АутентификацияЗапроса <> Неопределено Тогда

				ТипАутентификации = АутентификацияЗапроса["type"];
				ДанныеАутентификации = АутентификацияЗапроса[ТипАутентификации];
				Если ТипАутентификации = "bearer" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.BearerToken;
					НоваяСтрокаДерева.АутентификацияИспользовать = Истина;

					Если ДанныеАутентификации <> Неопределено Тогда
						Для Каждого СтрАутентифкации Из ДанныеАутентификации Цикл
							Если СтрАутентифкации["key"] = "token" Тогда
								НоваяСтрокаДерева.АутентификацияПароль = СтрАутентифкации["value"];
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
					
				ИначеЕсли ТипАутентификации = "basic" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.Базовая;
					НоваяСтрокаДерева.АутентификацияИспользовать = Истина;

					Если ДанныеАутентификации <> Неопределено Тогда
						Для Каждого СтрАутентифкации Из ДанныеАутентификации Цикл
							Если СтрАутентифкации["key"] = "username" Тогда
								НоваяСтрокаДерева.АутентификацияПользователь = СтрАутентифкации["value"];
							ИначеЕсли СтрАутентифкации["key"] = "password" Тогда
								НоваяСтрокаДерева.АутентификацияПароль = СтрАутентифкации["value"];
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
					
				ИначеЕсли ТипАутентификации = "ntlm" Тогда
					НоваяСтрокаДерева.АутентификацияВид = ВидыАутентификации.NTML;
					НоваяСтрокаДерева.АутентификацияИспользовать = Истина;
				КонецЕсли;
			КонецЕсли;
			
			ТелоЗапроса = ДанныеЗапроса["body"];
			Если ТелоЗапроса <> Неопределено Тогда
				ТипТела = ТелоЗапроса["mode"];
				ДанныеТелаЗапроса = ТелоЗапроса[ТипТела];
			
				Если ТипТела = Неопределено Тогда
					
				ИначеЕсли ТипТела = "raw" Тогда
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					НоваяСтрокаДерева.ТелоСтрокой = ТелоЗапроса["raw"];					

					ОпцииТела = ТелоЗапроса["options"];
					Если ОпцииТела <> Неопределено Тогда
						ОпцииТелаraw = ОпцииТела["raw"];
						Если ОпцииТелаraw<> Неопределено Тогда
							ОпцииТелаrawlanguage = ОпцииТелаraw["language"];
							Если ОпцииТелаrawlanguage = "json" Тогда
								НоваяСтрокаДерева.ТипСтроковогоСодержимого ="json";
							ИначеЕсли ОпцииТелаrawlanguage = "xml" Тогда 	
								НоваяСтрокаДерева.ТипСтроковогоСодержимого ="xml";
							КонецЕсли;
						КонецЕсли;
					КонецЕсли;

				ИначеЕсли ТипТела = "formdata" Тогда 	
					НоваяСтрокаДерева.ВидТела = ВидыТела.МультипартФорм;
					Если ДанныеТелаЗапроса <> Неопределено Тогда
						Для Каждого ЧастьТела Из ДанныеТелаЗапроса Цикл
							НоваяСтрокаМультипарт = НоваяСтрокаДерева.ТелоМультипарт.Добавить();
							НоваяСтрокаМультипарт.Использование = ЧастьТела["disabled"] <> Истина;
							НоваяСтрокаМультипарт.Имя = ЧастьТела["key"];

							Если ЧастьТела["type"] = "file" Тогда
								НоваяСтрокаМультипарт.Вид = ВидыЭлементовМультипарт.Файл;
								НоваяСтрокаМультипарт.Значение = ЧастьТела["src"];
							Иначе
								НоваяСтрокаМультипарт.Вид = ВидыЭлементовМультипарт.Строка;
								НоваяСтрокаМультипарт.Значение = ЧастьТела["value"];
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;					
					
				ИначеЕсли ТипТела = "file" Тогда 	
					НоваяСтрокаДерева.ВидТела = ВидыТела.Файл;
					Если ДанныеТелаЗапроса <> Неопределено Тогда
						НоваяСтрокаДерева.ИмяФайлаТела = ДанныеТелаЗапроса["src"];
					КонецЕсли;					
				ИначеЕсли ТипТела = "urlencoded" Тогда 		
					НоваяСтрокаДерева.ВидТела = ВидыТела.Строка;
					Если ДанныеТелаЗапроса <> Неопределено Тогда
						СтрокиУРЛТела = Новый Массив;
					//TODO Переделать на новый вид тела когда тот появится
						Для Каждого ЧастьТела Из ДанныеТелаЗапроса Цикл
							Если ЧастьТела["disabled"] = Истина Тогда
								Продолжить;
							КонецЕсли;

							ИмяПараметра = КодироватьСтроку(ЧастьТела["key"], СпособКодированияСтроки.КодировкаURL);
							ЗначениеПараметра = КодироватьСтроку(ЧастьТела["value"],
																 СпособКодированияСтроки.КодировкаURL);

							СтрокиУРЛТела.Добавить(ИмяПараметра + "=" + ЗначениеПараметра);
						КонецЦикла;

						НоваяСтрокаДерева.ТелоСтрокой = СтрСоединить(СтрокиУРЛТела, "&");
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		ИмпортироватьЭлементыКоллекцииPostmanКоллекции21(НоваяСтрокаДерева, ТекЭлементСодержимого["item"]);
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура ИмпортироватьДанныеPostmanКоллекции21(СодержимоеФайла)
	Информация = СодержимоеФайла["info"];
	Если Информация = Неопределено Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нерпавильный формат файла");
		Возврат;
	КонецЕсли;
	
	Если Информация["schema"] <> "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нерпавильная версия формата файла");
		Возврат;
	КонецЕсли;
	
	Если СодержимоеФайла["variable"] <> Неопределено Тогда
		НовыйНаборЗначений = НаборыЗначенийПеременных.Добавить();
		НовыйНаборЗначений.Имя = Информация["name"];
		Для Каждого ТекПеременная Из СодержимоеФайла["variable"] Цикл
			НоваяПеременнаяНабора = НовыйНаборЗначений.Переменные.Добавить();
			НоваяПеременнаяНабора.Имя = ТекПеременная["key"];	
			НоваяПеременнаяНабора.Значение = ТекПеременная["value"];	
		КонецЦикла;
	КонецЕсли;
	
	ИмпортироватьЭлементыКоллекцииPostmanКоллекции21(ДеревоЗапросов, СодержимоеФайла["item"]);

КонецПроцедуры



#КонецОбласти

#КонецОбласти

&НаКлиенте
Процедура ВыполнитьЗапросЗавершениеСохраненияФайла(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;
	СтрокаЗапроса = ДополнительныеПараметры.СтрокаЗапроса;
	
	ПараметрыСледующегоШага = Новый Структура;
	ПараметрыСледующегоШага.Вставить("ИдентификаторСтроки", СтрокаЗапроса.ПолучитьИдентификатор());
	ПараметрыСледующегоШага.Вставить("Файл", Неопределено);
	ПараметрыСледующегоШага.Вставить("НаКлиенте", СтрокаЗапроса.НаКлиенте);
	
	Если СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.Файл Тогда
		ИмяФайлаТела = СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЗапроса.ИмяФайлаТела, Переменные);
		Если СтрокаЗапроса.НаКлиенте Тогда
			ПараметрыСледующегоШага.Файл = Новый Структура;
			ПараметрыСледующегоШага.Файл.Вставить("ПолноеИмя", ИмяФайлаТела);
			ВыполнитьЗапросЗавершениеПодготовительныхДействий(ПараметрыСледующегоШага);
		Иначе
			ПараметрыЧтенияФайла = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыЧтенияФайла(УникальныйИдентификатор);
			ПараметрыЧтенияФайла.ПолноеИмяФайла = ИмяФайлаТела;
			ПараметрыЧтенияФайла.ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьЗапросЗавершениеЧтенияФайлаВоВременноеХранилище",
				ЭтотОбъект, ПараметрыСледующегоШага);

			УИ_ОбщегоНазначенияКлиент.НачатьЧтениеФайла(ПараметрыЧтенияФайла);
		КонецЕсли;
	ИначеЕсли СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.МультипартФорм Тогда
		НачатьПомещениеФайловВоВременноеХранилищеДляСтрокТелаМультипарт(СтрокаЗапроса,
																		Новый ОписаниеОповещения("ВыполнитьЗапросЗавершениеЧтенияФайловМультипартВоВременноеХранилище",
			ЭтотОбъект, ПараметрыСледующегоШага));
	Иначе
		ВыполнитьЗапросЗавершениеПодготовительныхДействий(ПараметрыСледующегоШага);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура НачатьПомещениеФайловВоВременноеХранилищеДляСтрокТелаМультипарт(СтрокаЗапроса, ОписаниеОповещенияОЗавершении)
	ПараметрыОповещений = Новый Структура;
	ПараметрыОповещений.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ПараметрыОповещений.Вставить("СтрокаДереваЗапросов", СтрокаЗапроса);
	ПараметрыОповещений.Вставить("ИндексСтрокиМультипарт", 0);
	ПараметрыОповещений.Вставить("СоответствиеПомещенныхФайлов", Новый Соответствие);

	УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("НачатьПомещениеФайловВоВременноеХранилищеДляСтрокТелаМультипартЗавершениеПодключенияРасширенияРаботыСФайлам",
		ЭтотОбъект, ПараметрыОповещений));
КонецПроцедуры


// Начать помещение файлов во временное хранилище для строк тела мультипарт завершение подключения расширения работы с файлам.
// 
// Параметры:
//  Подключено - Булево- Подключено
//  ДополнительныеПараметры - Структура:
//  * ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  * СтрокаДереваЗапросов - ДанныеФормыЭлементДерева
&НаКлиенте
Процедура НачатьПомещениеФайловВоВременноеХранилищеДляСтрокТелаМультипартЗавершениеПодключенияРасширенияРаботыСФайлам(Подключено,
	ДополнительныеПараметры) Экспорт
	Если Не Подключено Тогда
		Возврат;
	КонецЕсли;
	
	ПоместитьОчереднойФайлМультипарт(ДополнительныеПараметры);
КонецПроцедуры

// Поместить очередной файл мультипарт.
// 
// Параметры:
//  ДополнительныеПараметры - Структура:
//  * ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  * СтрокаДереваЗапросов - ДанныеФормыЭлементДерева
//  * СоответствиеПомещенныхФайлов - Соответствие из КлючИЗначение
//  * ИндексСтрокиМультипарт - Число
&НаКлиенте
Процедура ПоместитьОчереднойФайлМультипарт(ДополнительныеПараметры)
	ВидыМультипарт = ВидыЭлементовМультипарт();
	
	Для ТекИндекс = ДополнительныеПараметры.ИндексСтрокиМультипарт По ДополнительныеПараметры.СтрокаДереваЗапросов.ТелоМультипарт.Количество()
																	  - 1 Цикл
		СтрокаЭлементаМультипарт = ДополнительныеПараметры.СтрокаДереваЗапросов.ТелоМультипарт[ТекИндекс];
		Если СтрокаЭлементаМультипарт.Вид <> ВидыМультипарт.Файл Тогда
			Продолжить;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(СтрокаЭлементаМультипарт.Значение) Тогда
			Продолжить;
		КонецЕсли;

		ДополнительныеПараметры.ИндексСтрокиМультипарт = ТекИндекс;

		ПараметрыЧтения = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыЧтенияФайла(УникальныйИдентификатор);
		ПараметрыЧтения.РасширениеРаботыСФайламиПодключено = Истина;
		ПараметрыЧтения.ПолноеИмяФайла = СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Значение,
																				   Переменные);
		ПараметрыЧтения.ОповещениеОЗавершении = Новый ОписаниеОповещения("ПоместитьОчереднойФайлМультипартЗавершениеЧтенияОчередногоФайла",
			ЭтотОбъект, ДополнительныеПараметры);

		УИ_ОбщегоНазначенияКлиент.НачатьЧтениеФайла(ПараметрыЧтения);
		Возврат;
	КонецЦикла;

	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении,
								 ДополнительныеПараметры.СоответствиеПомещенныхФайлов);
КонецПроцедуры

// Поместить очередной файл мультипарт завершение чтения очередного файла.
// 
// Параметры:
//  Результат - Массив Из Структура:
//  	* ПолноеИмя - Строка
//  	* Хранение - Строка
//  ДополнительныеПараметры - Структура:
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* СтрокаДереваЗапросов - ДанныеФормыЭлементДерева
//  	* СоответствиеПомещенныхФайлов - Соответствие из КлючИЗначение
//  	* ИндексСтрокиМультипарт - Число
&НаКлиенте
Процедура ПоместитьОчереднойФайлМультипартЗавершениеЧтенияОчередногоФайла(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Неопределено Тогда
		Если Результат.Количество() > 0 Тогда
			ДополнительныеПараметры.СоответствиеПомещенныхФайлов.Вставить(ДополнительныеПараметры.ИндексСтрокиМультипарт,
																		  Результат[0]);
		КонецЕсли;
	КонецЕсли;
	ДополнительныеПараметры.ИндексСтрокиМультипарт = ДополнительныеПараметры.ИндексСтрокиМультипарт + 1;
	ПоместитьОчереднойФайлМультипарт(ДополнительныеПараметры);
КонецПроцедуры


&НаКлиенте
Процедура ДеревоЗапросовТелоМультипартЗначениеНачалоВыбораЗавершениеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если ВыбранныеФайлы.Количество() = 0  Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОЗавершении, ВыбранныеФайлы[0]);
КонецПроцедуры

// Дерево запросов тело мультипарт значение начало выбора завершение выбора.
// 
// Параметры:
//  Результат - Строка, Неопределено - Результат
//  ДополнительныеПараметры - Структура:
//  * ИдентификаторСтрокиЗапросов - Число
//  * ИдентификаторСтрокиТела - Число
&НаКлиенте
Процедура ДеревоЗапросовТелоМультипартЗначениеНачалоВыбораЗавершениеВыбора(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаДерева = ДеревоЗапросов.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтрокиЗапросов);
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаТела = СтрокаДерева.ТелоМультипарт.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтрокиТела);
	Если СтрокаТела = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаТела.Значение = Результат;
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикОжиданияАктивизацииСтрокиДереваЗапросов()
	СохранитьДанныеЗапросаВДеревоЗапросов();
	
	ТекДанные = Элементы.ДеревоЗапросов.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ИдентификаторТекущейСтрокиЗапросов = ТекДанные.ПолучитьИдентификатор();
	ИзвлечьДанныеЗапросаИзСтрокиДерева();
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЗаголовкиПоСодержимомуТелаЗапроса()
	СтрокаДерева = ТекущаяСтрокаЗапросов();
	Если СтрокаДерева = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	
	ЗначениеЗаголовкаСодержимого = "";

	Если СтрокаДерева.ВидТела = ВидыТелаЗапроса.Строка Тогда
		Если СтрокаДерева.ТипСтроковогоСодержимого <> "Нет" И ЗначениеЗаполнено(СтрокаДерева.ТипСтроковогоСодержимого) Тогда
			ТипыТекстов = ТипыТекстовогоСодержимого();
			Если ТипыТекстов.Свойство(СтрокаДерева.ТипСтроковогоСодержимого) Тогда
				ЗначениеЗаголовкаСодержимого = ТипыТекстов[СтрокаДерева.ТипСтроковогоСодержимого];

				Кодировка = "";
				
				Кодировки = ВидыКодировокТелаЗапроса();
								
				Если СтрокаДерева.КодировкаТела = Кодировки.Авто
					Или СтрокаДерева.КодировкаТела = Кодировки.Системная Тогда
						
				ИначеЕсли СтрокаДерева.КодировкаТела = Кодировки.UTF8 Тогда 
					Кодировка="utf-8";
				ИначеЕсли СтрокаДерева.КодировкаТела = Кодировки.ANSI Тогда 
					Кодировка = "windows-1251";
				ИначеЕсли СтрокаДерева.КодировкаТела = Кодировки.UTF16 Тогда 
					Кодировка = "utf-16";
				ИначеЕсли СтрокаДерева.КодировкаТела = Кодировки.OEM Тогда 
					Кодировка = "cp866";
				ИначеЕсли ЗначениеЗаполнено(СтрокаДерева.КодировкаТела) Тогда
					Кодировка = СтрокаДерева.КодировкаТела;
				КонецЕсли;
				Если ЗначениеЗаполнено(Кодировка) Тогда
					ЗначениеЗаголовкаСодержимого = ЗначениеЗаголовкаСодержимого
												   + "; charset="
												   + Кодировка;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли СтрокаДерева.ВидТела = ВидыТелаЗапроса.ДвоичныеДанные Тогда 
		//ЗначениеЗаголовкаСодержимого = "application/octet-stream";	
	ИначеЕсли СтрокаДерева.ВидТела = ВидыТелаЗапроса.МультипартФорм Тогда
		ЗначениеЗаголовкаСодержимого = "multipart/form-data; boundary=" + РазделительТелаМультипарт;
	Иначе
		Возврат;
	КонецЕсли;
		
	ИмяЗаголовкаПоиска = "Content-Type";
	
	Если ЗначениеЗаполнено(ЗначениеЗаголовкаСодержимого) Тогда
		ДобавитьЗаголовокЗапроса(ИмяЗаголовкаПоиска, ЗначениеЗаголовкаСодержимого);
//	Иначе
//		УдалитьЗаголовокЗапроса(ИмяЗаголовкаПоиска);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЗаголовокЗапроса(ИмяЗаголовка, ЗначениеЗаголовка)
	Если РедактированиеЗаголовковТаблицей Тогда
		НайденаСтрокаЗаголовка = Ложь;
		Для Каждого Стр Из ТаблицаЗаголовковЗапроса Цикл
			Если НРег(ИмяЗаголовка) = НРег(Стр.Ключ) Тогда
				Стр.Использование = Истина;
				Стр.Значение = ЗначениеЗаголовка;
				
				НайденаСтрокаЗаголовка = Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если Не НайденаСтрокаЗаголовка Тогда
			Стр = ТаблицаЗаголовковЗапроса.Добавить();
			Стр.Использование = Истина;
			Стр.Ключ = ИмяЗаголовка;
			Стр.Значение = ЗначениеЗаголовка;	
		КонецЕсли;
	Иначе
		СтрокиЗаголовков = СтрРазделить(ЗаголовкиСтрока, Символы.ПС);
		
		ИскомыйИндексЗаголовка = Неопределено;
		
		Для Индекс = 0 по СтрокиЗаголовков.Количество() -1 Цикл
			Стр = СтрокиЗаголовков[Индекс];
			
			Если Не ЗначениеЗаполнено(Стр) Тогда
				Продолжить;
			КонецЕсли;
			
			МассивЗаголовка = СтрРазделить(Стр, ":");
			Если НРег(МассивЗаголовка[0]) = НРег(ИмяЗаголовка) Тогда
				ИскомыйИндексЗаголовка = Индекс;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		СторокаДляВставки = СтрШаблон("%1:%2",ИмяЗаголовка, ЗначениеЗаголовка);
		
		Если ИскомыйИндексЗаголовка = Неопределено Тогда
			СтрокиЗаголовков.Добавить(СторокаДляВставки);
		Иначе
			СтрокиЗаголовков[ИскомыйИндексЗаголовка] = СторокаДляВставки;
		КонецЕсли;
			
		ЗаголовкиСтрока = СтрСоединить(СтрокиЗаголовков, Символы.ПС);
		
	КонецЕсли;
КонецПроцедуры

&НаКлиенте 
Процедура УдалитьЗаголовокЗапроса(ИмяЗаголовка)
	Если РедактированиеЗаголовковТаблицей Тогда
		УдаляемаяСтрока = Неопределено;
		Для Каждого Стр Из ТаблицаЗаголовковЗапроса Цикл
			Если НРег(ИмяЗаголовка) = НРег(Стр.Ключ) Тогда
				УдаляемаяСтрока = Стр;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		Если УдаляемаяСтрока <> Неопределено Тогда
			ТаблицаЗаголовковЗапроса.Удалить(УдаляемаяСтрока);
		КонецЕсли;
	Иначе
		СтрокиЗаголовков = СтрРазделить(ЗаголовкиСтрока, Символы.ПС);
		
		ИскомыйИндексЗаголовка = Неопределено;
		
		Для Индекс = 0 по СтрокиЗаголовков.Количество() -1 Цикл
			Стр = СтрокиЗаголовков[Индекс];
			
			Если Не ЗначениеЗаполнено(Стр) Тогда
				Продолжить;
			КонецЕсли;
			
			МассивЗаголовка = СтрРазделить(Стр, ":");
			Если НРег(МассивЗаголовка[0]) = НРег(ИмяЗаголовка) Тогда
				ИскомыйИндексЗаголовка = Индекс;
				Прервать;
			КонецЕсли;
		КонецЦикла;

		Если ИскомыйИндексЗаголовка <> Неопределено Тогда
			СтрокиЗаголовков.Удалить(ИскомыйИндексЗаголовка);
			ЗаголовкиСтрока = СтрСоединить(СтрокиЗаголовков, Символы.ПС);
		КонецЕсли;
		
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Функция ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, ИндексВставки, НовыйРодитель, Уровень = 0)

	Если Уровень = 0 Тогда

		Если НовыйРодитель = Неопределено Тогда
			НоваяСтрока = Дерево.ПолучитьЭлементы().Вставить(ИндексВставки);
		Иначе
			НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Вставить(ИндексВставки);
		КонецЕсли;

		ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока);
		ПереместитьСтрокуДерева(Дерево, ПеремещаемаяСтрока, ИндексВставки, НоваяСтрока, Уровень + 1);

		ПеремещаемаяСтрокаРодитель = ПеремещаемаяСтрока.ПолучитьРодителя();
		Если ПеремещаемаяСтрокаРодитель = Неопределено Тогда
			Дерево.ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		Иначе
			ПеремещаемаяСтрокаРодитель.ПолучитьЭлементы().Удалить(ПеремещаемаяСтрока);
		КонецЕсли;

	Иначе

		Для Каждого Строка Из ПеремещаемаяСтрока.ПолучитьЭлементы() Цикл
			НоваяСтрока = НовыйРодитель.ПолучитьЭлементы().Добавить();
			
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ПеремещаемаяСтрока);
			
			ПереместитьСтрокуДерева(Дерево, Строка, НоваяСтрока, ИндексВставки, Уровень + 1);
		КонецЦикла;

	КонецЕсли;

	Возврат НоваяСтрока;

КонецФункции


&НаСервере
Процедура СкопироватьДанныеСтрокиИсторииВЗапросНаСервере(ИдентификаторСтрокиЗапросов, ИдентификаторСтрокиИстории)
	СтрокаЗапроса = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтрокиЗапросов);
	СтрокаИстории = СтрокаЗапроса.ИсторияЗапросов.НайтиПоИдентификатору(ИдентификаторСтрокиИстории);
	
	СтрокаЗапроса.URLЗапроса = СтрокаИстории.URLЗапроса;
	СтрокаЗапроса.ВидТела = СтрокаИстории.ВидТелаЗапроса;
	СтрокаЗапроса.ЗапросHTTP = СтрокаИстории.HTTPФункция;
	СтрокаЗапроса.ИмяФайлаТела = СтрокаИстории.ТелоЗапросаИмяФайла;
	СтрокаЗапроса.ИспользоватьBOM = СтрокаИстории.BOM;
	СтрокаЗапроса.ИспользоватьПрокси = СтрокаИстории.ИспользоватьПрокси;
	СтрокаЗапроса.КодировкаТела = СтрокаИстории.КодировкаТелаЗапроса;
	СтрокаЗапроса.ПроксиАутентификацияОС = СтрокаИстории.ПроксиАутентификацияОС;
	СтрокаЗапроса.ПроксиПароль = СтрокаИстории.ПроксиПароль;
	СтрокаЗапроса.ПроксиПорт = СтрокаИстории.ПроксиПорт;
	СтрокаЗапроса.ПроксиПользователь = СтрокаИстории.ПроксиПользователь;
	СтрокаЗапроса.ПроксиСервер = СтрокаИстории.ПроксиСервер;
	СтрокаЗапроса.Таймаут = СтрокаИстории.Таймаут;
	СтрокаЗапроса.ТелоСтрокой = СтрокаИстории.ТелоЗапросаСтрока;

	СтрокаЗапроса.ТелоДвоичныеДанные = Неопределено;
	Если ЭтоАдресВременногоХранилища(СтрокаИстории.ТелоЗапросаАдресДвоичныхДанных) Тогда
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(СтрокаИстории.ТелоЗапросаАдресДвоичныхДанных);
		Если ТипЗнч(ДвоичныеДанные) = Тип("ДвоичныеДанные") Тогда
			СтрокаЗапроса.ТелоДвоичныеДанные = УИ_ОбщегоНазначения.ЗначениеХранилищаКонтейнераДвочныхДанных(ДвоичныеДанные);
		КонецЕсли;
	КонецЕсли;
	
	ЗаполнитьТаблицуЗаголовковПоСтроке(СтрокаИстории.ЗаголовкиЗапроса, СтрокаЗапроса.Заголовки);
//	СтрокаЗапроса.ПараметрыURL = СтрокаИстории.КодировкаТелаЗапроса;

КонецПроцедуры

&НаКлиенте
Функция СтруктураОписанияСохраняемогоФайла()
	Структура=УИ_ОбщегоНазначенияКлиент.ПустаяСтруктураОписанияВыбираемогоФайла();
	Структура.ИмяФайла=ИмяФайлаЗапросов;

	// Пока закоментим сохранение в JSON, т.к. библиотека ошибки выдает на двоичных данных
	УИ_ОбщегоНазначенияКлиент.ДобавитьФорматВОписаниеФайлаСохранения(Структура,
		"Файл запросов консоли HTTP (*.uihttp)", "uihttp");

	Возврат Структура;
КонецФункции

&НаКлиенте
Процедура ВыполнитьСохранениеЗапросовВФайл(СохранитьКак = Ложь, ОписаниеОповещенияОЗаверешении = Неопределено)
	СохранитьДанныеЗапросаВДеревоЗапросов();
	СохранитьЗначенияПеременныхВТекущийНаборДанных();
	
	ДопПараметрыОповещения = Неопределено;
	Если ОписаниеОповещенияОЗаверешении <> Неопределено Тогда
		ДопПараметрыОповещения = Новый Структура;
		ДопПараметрыОповещения.Вставить("ОписаниеОповещенияОЗаверешении", ОписаниеОповещенияОЗаверешении);
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.СохранитьДанныеКонсолиВФайл("КонсольHTTPЗапросов",
														  СохранитьКак,
														  СтруктураОписанияСохраняемогоФайла(),
														  ПолучитьСтрокуДанныхФайлаДляСохраненияВФайл(),
														  Новый ОписаниеОповещения("СохранениеВФайлЗавершение",
		ЭтотОбъект, ДопПараметрыОповещения));

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииВидаТелаЗапроса()
	СтрокаЗапроса = ТекущаяСтрокаЗапросов();	
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	ВидимостьТелаСтрокой = Ложь;
	Если СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.БезТела Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаТелаЗапросаБезТела;
	ИначеЕсли СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.Строка Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаТелаЗапросаСтрокой;
		ВидимостьТелаСтрокой = Истина;
	ИначеЕсли СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.ДвоичныеДанные Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаТелаЗапросаДвоичныеДанные;
	ИначеЕсли СтрокаЗапроса.ВидТела = ВидыТелаЗапроса.МультипартФорм Тогда 
		НоваяСтраница = Элементы.ГруппаСтраницаТелаМультипарт;
	Иначе
		НоваяСтраница = Элементы.ГруппаСтраницаТелаЗапросаИмяФайлаТела;
	КонецЕсли;

	Элементы.ГруппаСтраницыТелаЗапроса.ТекущаяСтраница = НоваяСтраница;
	
	УИ_РедакторКодаКлиент.ПереключитьВидимостьРедактора(ЭтотОбъект, "ТЕЛО", ВидимостьТелаСтрокой);
	
	УстановитьЗаголовкиПоСодержимомуТелаЗапроса();
КонецПроцедуры


&НаКлиенте
Процедура ПриИзмененииВидаАутентификацииЗапроса()
	СтрокаЗапроса = ТекущаяСтрокаЗапросов();	
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	Виды = ВидыАутентификации();
		
	ВидимостьГруппыНастроекАутентификации = Истина;
	Если СтрокаЗапроса.АутентификацияВид = Виды.Базовая Или СтрокаЗапроса.АутентификацияВид = Виды.Базовая1С Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаАутентифкацияБазовая;
	ИначеЕсли СтрокаЗапроса.АутентификацияВид = Виды.BearerToken Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаАутентификацияТокен;
	ИначеЕсли СтрокаЗапроса.АутентификацияВид = Виды.NTML Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаАутентифкацияЗаглушка;
	Иначе
		ВидимостьГруппыНастроекАутентификации = Ложь;
		НоваяСтраница = Элементы.ГруппаСтраницаАутентифкацияЗаглушка;
	КонецЕсли;

	Элементы.ГруппаСтраницыВидыАутентификации.ТекущаяСтраница = НоваяСтраница;
	Элементы.ГруппаНастройкиАутентификацииЗапроса.Видимость = ВидимостьГруппыНастроекАутентификации;
КонецПроцедуры

&НаКлиенте
Функция ТекущаяСтрокаЗапросов()
	Если УИ_ИдентификаторТекущейСтрокиЗапросов = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	Возврат ДеревоЗапросов.НайтиПоИдентификатору(УИ_ИдентификаторТекущейСтрокиЗапросов);	
	
КонецФункции

// Виды тела запроса.
// 
// Возвращаемое значение:
//  Структура -  Виды тела запроса:
// * Строка - Строка - 
// * ДвоичныеДанные - Строка - 
// * Файл - Строка - 
&НаКлиентеНаСервереБезКонтекста
Функция ВидыТелаЗапроса()

	ВидыТела = Новый Структура;
	ВидыТела.Вставить("БезТела", "БезТела");	
	ВидыТела.Вставить("Строка", "Строка");	
	ВидыТела.Вставить("ДвоичныеДанные", "ДвоичныеДанные");	
	ВидыТела.Вставить("Файл", "Файл");	
	ВидыТела.Вставить("МультипартФорм", "МультипартФорм");	

	Возврат ВидыТела;
КонецФункции

// Виды элементов мультипарт.
// 
// Возвращаемое значение:
//  Структура -  Виды элементов мультипарт:
// * Строка - Строка - 
// * Файл - Строка - 
&НаКлиентеНаСервереБезКонтекста
Функция ВидыЭлементовМультипарт()
	Виды = Новый Структура;
	Виды.Вставить("Строка", "Строка");
	Виды.Вставить("Файл", "Файл");
	
	Возврат Виды;
КонецФункции

// Виды HTTPМетодов.
// 
// Возвращаемое значение:
//  Структура -  Виды HTTPМетодов:
// * GET - Строка - 
// * POST - Строка - 
// * PUT - Строка - 
// * PATCH - Строка - 
// * DELETE - Строка - 
// * OPTIONS - Строка - 
// * HEAD - Строка - 
&НаКлиентеНаСервереБезКонтекста
Функция ВидыHTTPМетодов()
	Виды = Новый Структура;
	Виды.Вставить("GET", "GET");
	Виды.Вставить("POST", "POST");
	Виды.Вставить("PUT", "PUT");
	Виды.Вставить("PATCH", "PATCH");
	Виды.Вставить("DELETE", "DELETE");
	Виды.Вставить("OPTIONS", "OPTIONS");
	Виды.Вставить("HEAD", "HEAD");
	
	Возврат Виды;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ТипыТекстовогоСодержимого()
	Типы = Новый Структура;
	Типы.Вставить("json", "application/json");
	Типы.Вставить("xml", "application/xml");
	Типы.Вставить("yaml", "text/yaml");
	Типы.Вставить("текст", "text/plain");

	Возврат Типы;	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВидыАутентификации()
	Виды = Новый Структура;
	Виды.Вставить("Нет", "Нет");
	Виды.Вставить("Базовая", "Базовая");
	Виды.Вставить("BearerToken", "BearerToken");
	Виды.Вставить("NTML", "NTML");
	Виды.Вставить("Базовая1С", "Базовая1С");
	
	Возврат Виды;
КонецФункции

#Область ПараметрыДереваЗапроса



&НаКлиенте
Функция ПодготовитьСтрокуПараметров()
//		стрПараметры = "";
//		
//	Для Каждого стрПараметра Из ПараметрыURL Цикл
//		Если стрПараметра.Использование Тогда
//			Если ПустаяСтрока(стрПараметры) Тогда
//				стрПараметры = СтрШаблон("%1=%2", стрПараметра.Имя, стрПараметра.Значение);
//			Иначе
//				стрПараметры = стрПараметры+"&"+СтрШаблон("%1=%2", стрПараметра.Имя, стрПараметра.Значение);
//			КонецЕсли;
//		КонецЕсли;
//	КонецЦикла;
//	
//	Возврат стрПараметры;
Возврат "";
КонецФункции

#КонецОбласти

#Область ФайлыЗапросов

// Отработка загрузки файла с отчетами из адреса.
&НаКлиенте
Процедура ОтработкаЗагрузкиИзАдреса(Адрес)

	ЗагрузитьФайлКонсолиНаСервере(Адрес);

	ОбновитьЗаголовок();
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьЗапросыИзФайла(ЗапросФайла, КоллекцияЭлементовЗапросов, ВерсияФормата)
	НоваяСтрокаЗапросов = КоллекцияЭлементовЗапросов.Добавить();
	НоваяСтрокаЗапросов.Имя = ЗапросФайла.Имя;
	НоваяСтрокаЗапросов.URLЗапроса = ЗапросФайла.URLЗапроса;
	НоваяСтрокаЗапросов.ВидТела = ЗапросФайла.ВидТела;
	НоваяСтрокаЗапросов.ЗапросHTTP = ЗапросФайла.ЗапросHTTP;
	НоваяСтрокаЗапросов.ИмяФайлаТела = ЗапросФайла.ИмяФайлаТела;
	НоваяСтрокаЗапросов.ИспользоватьBOM = ЗапросФайла.ИспользоватьBOM;
	НоваяСтрокаЗапросов.КодировкаТела = ЗапросФайла.КодировкаТела;
	НоваяСтрокаЗапросов.ИспользоватьПрокси = ЗапросФайла.ИспользоватьПрокси;
	НоваяСтрокаЗапросов.ПроксиАутентификацияОС = ЗапросФайла.ПроксиАутентификацияОС;
	НоваяСтрокаЗапросов.ПроксиПароль = ЗапросФайла.ПроксиПароль;
	НоваяСтрокаЗапросов.ПроксиПользователь = ЗапросФайла.ПроксиПользователь;
	НоваяСтрокаЗапросов.ПроксиПорт = ЗапросФайла.ПроксиПорт;
	НоваяСтрокаЗапросов.ПроксиСервер = ЗапросФайла.ПроксиСервер;
	НоваяСтрокаЗапросов.Таймаут = ЗапросФайла.Таймаут;
	НоваяСтрокаЗапросов.ТелоСтрокой = ЗапросФайла.ТелоСтрокой;
	НоваяСтрокаЗапросов.ТелоДвоичныеДанные = Неопределено;
	НоваяСтрокаЗапросов.ТипСтроковогоСодержимого = ЗапросФайла.ТипСтроковогоСодержимого;
	НоваяСтрокаЗапросов.Комментарий = ЗапросФайла.Комментарий;

	Если ВерсияФормата >=3 Тогда
		НоваяСтрокаЗапросов.НаКлиенте = ЗапросФайла.НаКлиенте;
	КонецЕсли;

	Если ВерсияФормата >= 4 Тогда
		НоваяСтрокаЗапросов.АлгоритмПередВыполнением = ЗапросФайла.АлгоритмПередВыполнением;	
		НоваяСтрокаЗапросов.АлгоритмПослеВыполнения = ЗапросФайла.АлгоритмПослеВыполнения;	
	КонецЕсли;
	
	//Аутентификация
	НоваяСтрокаЗапросов.АутентификацияВид = ЗапросФайла.АутентификацияВид;
	НоваяСтрокаЗапросов.АутентификацияИспользовать = ЗапросФайла.АутентификацияИспользовать;
	НоваяСтрокаЗапросов.АутентификацияПароль = ЗапросФайла.АутентификацияПароль;
	НоваяСтрокаЗапросов.АутентификацияПользователь = ЗапросФайла.АутентификацияПользователь;
	НоваяСтрокаЗапросов.АутентификацияИмяЗаголовка = ЗапросФайла.АутентификацияИмяЗаголовка;
	НоваяСтрокаЗапросов.АутентификацияПрефиксТокена = ЗапросФайла.АутентификацияПрефиксТокена;
	
	Если ЗапросФайла.ТелоДвоичныеДанные <> Неопределено Тогда
		Попытка
			Хранилище = ЗначениеИзСтрокиВнутр(ЗапросФайла.ТелоДвоичныеДанные);//ХранилищеЗначения
			ДвоичныеДанные = Хранилище.Получить();
			НоваяСтрокаЗапросов.ТелоДвоичныеДанные = УИ_ОбщегоНазначения.ЗначениеХранилищаКонтейнераДвочныхДанных(ДвоичныеДанные);
		Исключение
			УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Для запроса "
																 + НоваяСтрокаЗапросов.Имя
																 + " не удалось прочитать двоичные данные тела запроса");
		КонецПопытки;
	КонецЕсли;

	Для Каждого ТекЗаголовок Из ЗапросФайла.Заголовки Цикл
		НоваяСтрока = НоваяСтрокаЗапросов.Заголовки.Добавить();
		НоваяСтрока.Использование = ТекЗаголовок.Использование;
		НоваяСтрока.Ключ = ТекЗаголовок.Ключ;
		НоваяСтрока.Значение = ТекЗаголовок.Значение;
	КонецЦикла;	
	
	Для Каждого ТекЗаголовок Из ЗапросФайла.ПараметрыURL Цикл
		НоваяСтрока = НоваяСтрокаЗапросов.ПараметрыURL.Добавить();
		НоваяСтрока.Использование = ТекЗаголовок.Использование;
		НоваяСтрока.Имя = ТекЗаголовок.Имя;
		НоваяСтрока.Значение = ТекЗаголовок.Значение;
	КонецЦикла;	

	Для Каждого ТекОписание Из ЗапросФайла.ТелоМультипарт Цикл
		НоваяСтрока = НоваяСтрокаЗапросов.ТелоМультипарт.Добавить();
		НоваяСтрока.Использование = ТекОписание.Использование;
		НоваяСтрока.Имя = ТекОписание.Имя;
		НоваяСтрока.Вид = ТекОписание.Вид;
		НоваяСтрока.Значение = ТекОписание.Значение;
	КонецЦикла;

	КоллекцияСтрок = НоваяСтрокаЗапросов.ПолучитьЭлементы();
	Для Каждого ПодчиненныйЗапрос Из ЗапросФайла.Строки Цикл
		ЗаполнитьЗапросыИзФайла(ПодчиненныйЗапрос, КоллекцияСтрок, ВерсияФормата)
	КонецЦикла;

КонецПроцедуры



// Загрузить файл консоли на сервере.
//
// Параметры:
//  Адрес - Строка -адрес хранилища, из которого нужно загрузить файл.
&НаСервере
Процедура ЗагрузитьФайлКонсолиНаСервере(Адрес)
	
	ДанныеФайла=ПолучитьИзВременногоХранилища(Адрес);

	ЧтениеJSON=Новый ЧтениеJSON;
	ЧтениеJSON.ОткрытьПоток(ДанныеФайла.ОткрытьПотокДляЧтения());

	СтруктураФайла=ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();

	ЭлементыЗапросов =  ДеревоЗапросов.ПолучитьЭлементы();
	ЭлементыЗапросов.Очистить();
	
	Для Каждого ТекЗапрос Из СтруктураФайла.Запросы Цикл
		ЗаполнитьЗапросыИзФайла(ТекЗапрос, ЭлементыЗапросов, СтруктураФайла.ВерсияФормата);	
	КонецЦикла;

	Если СтруктураФайла.ВерсияФормата >=4 Тогда
		НаборыЗначенийПеременных.Очистить();
		Переменные.Очистить();

		Для Каждого ТекНабор Из СтруктураФайла.НаборыПеременных Цикл
			НоваяСтрока = НаборыЗначенийПеременных.Добавить();
			НоваяСтрока.Имя = ТекНабор.Имя;
			
			Для Каждого ЗначениеПеременной Из ТекНабор.ЗначенияПеременных Цикл
				НоваяСтрокаЗначения = НоваяСтрока.Переменные.Добавить();
				НоваяСтрокаЗначения.Имя = ЗначениеПеременной.Имя;
				НоваяСтрокаЗначения.Значение = ЗначениеПеременной.Значение;
			КонецЦикла;
		КонецЦикла;
	
		Если НаборыЗначенийПеременных.Количество() = 0 Тогда
			НоваяСтрока = НаборыЗначенийПеременных.Добавить();
			ИнициализироватьСтрокуНаборПеременных(НоваяСтрока, ЭтотОбъект);
		КонецЕсли;

		Для Каждого ТекИмя Из СтруктураФайла.Переменные Цикл
			НоваяСтрока = Переменные.Добавить();
			НоваяСтрока.Имя = ТекИмя;
		КонецЦикла;

		ТекСтрока = Неопределено;
		Если СтруктураФайла.ТекущийНабор = -1 Тогда
			ТекСтрока = НаборыЗначенийПеременных[0];
		ИначеЕсли ТипЗнч(СтруктураФайла.ТекущийНабор) = Тип("Число") Тогда
			ТекСтрока = НаборыЗначенийПеременных[СтруктураФайла.ТекущийНабор];
		КонецЕсли;

		Если ТекСтрока <> Неопределено Тогда	
			ТекущийНаборЗначенийПеременных = ТекСтрока.ПолучитьИдентификатор();
			ПриИзмененииТекущегоНабораПеременных(ЭтотОбъект);
			
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлКонсолиПослеПомещенияФайла(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_ИдентификаторТекущейСтрокиЗапросов = Неопределено;
	ИмяФайлаЗапросов = Результат.ИмяФайла;
	ОтработкаЗагрузкиИзАдреса(Результат.Адрес);
	
	Элементы.НаборыЗначенийПеременных.ТекущаяСтрока = ТекущийНаборЗначенийПеременных;
	Модифицированность = Ложь;
КонецПроцедуры

// Загрузить файл.
//
// Параметры:
//  БезВыбораФайла - Булево
&НаКлиенте
Процедура ЗагрузитьФайлКонсоли(БезВыбораФайла = Ложь)

	УИ_ОбщегоНазначенияКлиент.ПрочитатьДанныеКонсолиИзФайла("КонсольHTTPЗапросов",
															СтруктураОписанияСохраняемогоФайла(),
															Новый ОписаниеОповещения("ЗагрузитьФайлКонсолиПослеПомещенияФайла",
		ЭтотОбъект),
															БезВыбораФайла);

КонецПроцедуры

// Завершение обработчика открытия файла.
// 
// Параметры:
//  РезультатВопроса - КодВозвратаДиалога 
//  ДополнительныеПараметры - Произвольный
&НаКлиенте
Процедура ОткрытьФайлОтчетовЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	ЗагрузитьФайлКонсоли();
	
КонецПроцедуры

&НаКлиенте
Процедура ИнициализироватьКонсоль()
	Модифицированность = Ложь;
	ИмяФайлаЗапросов = "";

	ДеревоЗапросов.ПолучитьЭлементы().Очистить();
	ИнициализироватьТаблицыФормы();


	ОбновитьЗаголовок();
КонецПроцедуры

// Завершение обработчика создания нового файла запросов.
// 
// Параметры:
//  РезультатВопроса - КодВозвратаДиалога
//  ДополнительныеПараметры - Произвольный
&НаКлиенте
Процедура НовыйФайлЗапросовЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	ИнициализироватьКонсоль();

КонецПроцедуры

// Завершение обработчика открытия файла.
// 
// Параметры:
//  Результат - Строка
//  ДополнительныеПараметры - Произвольный
&НаКлиенте
Процедура СохранениеВФайлЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ИмяФайлаЗапросов=Результат;
	Модифицированность = Ложь;
	ОбновитьЗаголовок();

	Если ДополнительныеПараметры <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗаверешении, Истина);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ОписаниеЗапросаДляСохраненияВФайл(СтрокаДереваЗапросов)
	ОписаниеЗапроса = Новый Структура;
	ОписаниеЗапроса.Вставить("Имя", СтрокаДереваЗапросов.Имя);
	ОписаниеЗапроса.Вставить("URLЗапроса", СтрокаДереваЗапросов.URLЗапроса);
	ОписаниеЗапроса.Вставить("ВидТела", СтрокаДереваЗапросов.ВидТела);
	ОписаниеЗапроса.Вставить("ЗапросHTTP", СтрокаДереваЗапросов.ЗапросHTTP);
	ОписаниеЗапроса.Вставить("ИмяФайлаТела", СтрокаДереваЗапросов.ИмяФайлаТела);
	ОписаниеЗапроса.Вставить("ИспользоватьBOM", СтрокаДереваЗапросов.ИспользоватьBOM);
	ОписаниеЗапроса.Вставить("КодировкаТела", СтрокаДереваЗапросов.КодировкаТела);
	ОписаниеЗапроса.Вставить("ИспользоватьПрокси", СтрокаДереваЗапросов.ИспользоватьПрокси);
	ОписаниеЗапроса.Вставить("ПроксиАутентификацияОС", СтрокаДереваЗапросов.ПроксиАутентификацияОС);
	ОписаниеЗапроса.Вставить("ПроксиПароль", СтрокаДереваЗапросов.ПроксиПароль);
	ОписаниеЗапроса.Вставить("ПроксиПользователь", СтрокаДереваЗапросов.ПроксиПользователь);
	ОписаниеЗапроса.Вставить("ПроксиПорт", СтрокаДереваЗапросов.ПроксиПорт);
	ОписаниеЗапроса.Вставить("ПроксиСервер", СтрокаДереваЗапросов.ПроксиСервер);
	ОписаниеЗапроса.Вставить("Таймаут", СтрокаДереваЗапросов.Таймаут);
	ОписаниеЗапроса.Вставить("ТелоСтрокой", СтрокаДереваЗапросов.ТелоСтрокой);
	ОписаниеЗапроса.Вставить("ТипСтроковогоСодержимого", СтрокаДереваЗапросов.ТипСтроковогоСодержимого);
	ОписаниеЗапроса.Вставить("Комментарий", СтрокаДереваЗапросов.Комментарий);
	ОписаниеЗапроса.Вставить("НаКлиенте", СтрокаДереваЗапросов.НаКлиенте);
	ОписаниеЗапроса.Вставить("АлгоритмПередВыполнением", СтрокаДереваЗапросов.АлгоритмПередВыполнением);
	ОписаниеЗапроса.Вставить("АлгоритмПослеВыполнения", СтрокаДереваЗапросов.АлгоритмПослеВыполнения);

	//Аутентификация
	ОписаниеЗапроса.Вставить("АутентификацияВид", СтрокаДереваЗапросов.АутентификацияВид);
	ОписаниеЗапроса.Вставить("АутентификацияИспользовать", СтрокаДереваЗапросов.АутентификацияИспользовать);
	ОписаниеЗапроса.Вставить("АутентификацияПароль", СтрокаДереваЗапросов.АутентификацияПароль);
	ОписаниеЗапроса.Вставить("АутентификацияПользователь", СтрокаДереваЗапросов.АутентификацияПользователь);
	ОписаниеЗапроса.Вставить("АутентификацияПрефиксТокена", СтрокаДереваЗапросов.АутентификацияПрефиксТокена);
	ОписаниеЗапроса.Вставить("АутентификацияИмяЗаголовка", СтрокаДереваЗапросов.АутентификацияИмяЗаголовка);
	
	
	Если СтрокаДереваЗапросов.ТелоДвоичныеДанные = Неопределено Тогда
		ОписаниеЗапроса.Вставить("ТелоДвоичныеДанные", Неопределено);
	Иначе
		ДвоичныеДанные = УИ_ОбщегоНазначения.ЗначениеИзХранилищаКонтейнераДвоичныхДанных(СтрокаДереваЗапросов.ТелоДвоичныеДанные);
		ОписаниеЗапроса.Вставить("ТелоДвоичныеДанные", ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(ДвоичныеДанные,
			Новый СжатиеДанных(9))));
	КонецЕсли;
	
	ОписаниеЗапроса.Вставить("Заголовки", Новый Массив);
	
	Для Каждого Стр Из СтрокаДереваЗапросов.Заголовки Цикл
		ОписаниеЗаголовка = Новый Структура;
		ОписаниеЗаголовка.Вставить("Использование", Стр.Использование);
		ОписаниеЗаголовка.Вставить("Ключ", Стр.Ключ);
		ОписаниеЗаголовка.Вставить("Значение", Стр.Значение);

		ОписаниеЗапроса.Заголовки.Добавить(ОписаниеЗаголовка);
	КонецЦикла;
	
	ОписаниеЗапроса.Вставить("ПараметрыURL", Новый Массив);
	Для Каждого Стр Из СтрокаДереваЗапросов.ПараметрыURL Цикл
		ОписаниеПараметра = Новый Структура;
		ОписаниеПараметра.Вставить("Использование", Стр.Использование);
		ОписаниеПараметра.Вставить("Имя", Стр.Имя);
		ОписаниеПараметра.Вставить("Значение", Стр.Значение);
		
		ОписаниеЗапроса.ПараметрыURL.Добавить(ОписаниеПараметра);
	КонецЦикла;
	
	ОписаниеЗапроса.Вставить("ТелоМультипарт", Новый Массив);
	Для Каждого Стр Из СтрокаДереваЗапросов.ТелоМультипарт Цикл
		Описание= Новый Структура;
		Описание.Вставить("Использование", Стр.Использование);
		Описание.Вставить("Имя", Стр.Имя);
		Описание.Вставить("Вид", Стр.Вид);
		Описание.Вставить("Значение", Стр.Значение);
		
		ОписаниеЗапроса.ТелоМультипарт.Добавить(Описание);
	КонецЦикла;
	
	ОписаниеЗапроса.Вставить("Строки", Новый Массив);
	
	Для Каждого Стр Из СтрокаДереваЗапросов.ПолучитьЭлементы() Цикл
		ОписаниеЗапроса.Строки.Добавить(ОписаниеЗапросаДляСохраненияВФайл(Стр));
	КонецЦикла;

	Возврат ОписаниеЗапроса;
КонецФункции

&НаСервере
Функция ОписаниеНабораЗначенийПеременных(СтрокаНабора)
	ОписаниеНабора = Новый Структура;
	ОписаниеНабора.Вставить("Имя", СтрокаНабора.Имя);
	ОписаниеНабора.Вставить("ЗначенияПеременных", Новый Массив);
	
	Для Каждого ТекСтрокаПеременной Из СтрокаНабора.Переменные Цикл
		ОписаниеЗначенияПеременной = Новый Структура;
		ОписаниеЗначенияПеременной.Вставить("Имя", ТекСтрокаПеременной.Имя);
		ОписаниеЗначенияПеременной.Вставить("Значение", ТекСтрокаПеременной.Значение);
		
		ОписаниеНабора.ЗначенияПеременных.Добавить(ОписаниеЗначенияПеременной);
	КонецЦикла;
	
	Возврат ОписаниеНабора;
КонецФункции

&НаСервере
Функция ПолучитьСтрокуДанныхФайлаДляСохраненияВФайл()
	
	СохраняемыеДанные = Новый Структура;
	СохраняемыеДанные.Вставить("ВерсияФормата", 4);
	СохраняемыеДанные.Вставить("Запросы", Новый Массив);
	СохраняемыеДанные.Вставить("НаборыПеременных", Новый Массив);
	СохраняемыеДанные.Вставить("Переменные", Новый Массив);
	СохраняемыеДанные.Вставить("ТекущийНабор", -1);
	
	Для Каждого СтрокаАлгоритма Из ДеревоЗапросов.ПолучитьЭлементы() Цикл
		СохраняемыеДанные.Запросы.Добавить(ОписаниеЗапросаДляСохраненияВФайл(СтрокаАлгоритма));
	КонецЦикла;
	
	ИндексНабора = 0;
	Для Каждого ЭлементНабора Из НаборыЗначенийПеременных Цикл
		СохраняемыеДанные.НаборыПеременных.Добавить(ОписаниеНабораЗначенийПеременных(ЭлементНабора));
	
		Если ЭлементНабора.ПолучитьИдентификатор() = ТекущийНаборЗначенийПеременных Тогда
			СохраняемыеДанные.ТекущийНабор = ИндексНабора;				
		КонецЕсли;
		ИндексНабора = ИндексНабора + 1;
	КонецЦикла;
	
	Для Каждого Элемент Из Переменные Цикл
		СохраняемыеДанные.Переменные.Добавить(Элемент.Имя);
	КонецЦикла;
	
	Возврат УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(СохраняемыеДанные);

КонецФункции

#КонецОбласти

#Область ВыполнениеЗапроса

&НаКлиенте
Процедура ОбработчикВыполненияЗапроса() 
	СохранитьДанныеЗапросаВДеревоЗапросов();
	СохранитьЗначенияПеременныхВТекущийНаборДанных();
	
	СтрокаЗапроса  = ТекущаяСтрокаЗапросов();
	Если СтрокаЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ВозможноИсполнениеЗапроса(СтрокаЗапроса) Тогда
		Возврат;	
	КонецЕсли;
	
	ДопПараметры = Новый Структура;
	ДопПараметры.Вставить("СтрокаЗапроса", СтрокаЗапроса);
	Если СохранятьПередВыполнением И ЗначениеЗаполнено(ИмяФайлаЗапросов) Тогда
		ВыполнитьСохранениеЗапросовВФайл( , Новый ОписаниеОповещения("ВыполнитьЗапросЗавершениеСохраненияФайла",
			ЭтотОбъект, ДопПараметры));
	Иначе
		ВыполнитьЗапросЗавершениеСохраненияФайла(Истина, ДопПараметры);
	КонецЕсли;
	
КонецПроцедуры

// Выполнить запрос завершение подготовительных действий.
// 
// Параметры:
//  ПараметрыЗаврешения - Структура -  Параметры заврешения:
// * ИдентификаторСтроки - Число - 
// * НаКлиенте - Булево -
// * Файл - Структура: 
// 		** Хранение - Строка - Адрес файла во временном хранилище
// 		** ПолноеИмя - Строка 
&НаКлиенте
Процедура ВыполнитьЗапросЗавершениеПодготовительныхДействий(ПараметрыЗаврешения)
	Если ПараметрыЗаврешения.НаКлиенте Тогда
		ВыполнитьЗапросНаКлиенте(ПараметрыЗаврешения.ИдентификаторСтроки, ПараметрыЗаврешения.Файл);
	Иначе
		ВыполнитьЗапросНаСервере(ПараметрыЗаврешения.ИдентификаторСтроки, ПараметрыЗаврешения.Файл);
	КонецЕсли;

	Если Не ПараметрыЗаврешения.НаКлиенте Или Не УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.21") Тогда
		ЗавершитьОчереднуюИтерациюПериодическогоИсполненияЗапроса();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапросЗавершениеЧтенияФайлаВоВременноеХранилище(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось поместить файл тела во временное хранилище");
		Возврат;
	КонецЕсли;
	
	Если Результат.Количество() = 0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось поместить файл тела во временное хранилище");
		Возврат;
	КонецЕсли;
	
	
	ДополнительныеПараметры.Вставить("Файл", Результат[0]);
	
	ВыполнитьЗапросЗавершениеПодготовительныхДействий(ДополнительныеПараметры);
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапросЗавершениеЧтенияФайловМультипартВоВременноеХранилище(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось поместить файлы тела во временное хранилище");
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.Вставить("Файл", Результат);
	
	ВыполнитьЗапросЗавершениеПодготовительныхДействий(ДополнительныеПараметры);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ДополнитьСписокИспользованныхРанееЗаголовков(Форма, Заголовки)
	Для Каждого КлючЗначение Из Заголовки Цикл
		Если Форма.СписокИспользованныхЗаголовков.НайтиПоЗначению(КлючЗначение.Ключ) = Неопределено Тогда
			Форма.СписокИспользованныхЗаголовков.Добавить(КлючЗначение.Ключ);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ЗафиксироватьЛогЗапроса(Форма, СтрокаДереваЗапросов, URLДляИсполнения, АдресСервера, Протокол, HTTPЗапрос,
	HTTPОтвет, ДатаНачала, Длительность, ДанныеФайлаТела)

		//	Если HTTPОтвет = Неопределено Тогда 
	//		Ошибка = Истина;
	//	Иначе 
	//		Ошибка=Не ПроверитьУспешностьВыполненияЗапроса(HTTPОтвет);//.КодСостояния<>КодУспешногоЗапроса;
	//	КонецЕсли;
	ЗаписьЛога = СтрокаДереваЗапросов.ИсторияЗапросов.Добавить();
	ЗаписьЛога.URLЗапроса = URLДляИсполнения;

	ЗаписьЛога.HTTPФункция = СтрокаДереваЗапросов.ЗапросHTTP;
	ЗаписьЛога.АдресСервера = АдресСервера;
	ЗаписьЛога.Дата = ДатаНачала;
	ЗаписьЛога.ДлительностьВыполнения = Длительность;
	ЗаписьЛога.Запрос = HTTPЗапрос.АдресРесурса;
	ЗаписьЛога.ЗаголовкиЗапроса = УИ_ОбщегоНазначенияКлиентСервер.ПолучитьСтрокуЗаголовковHTTP(HTTPЗапрос.Заголовки);
	ЗаписьЛога.BOM = СтрокаДереваЗапросов.ИспользоватьBOM;
	ЗаписьЛога.КодировкаТелаЗапроса = СтрокаДереваЗапросов.КодировкаТела;
	ЗаписьЛога.ВидТелаЗапроса = СтрокаДереваЗапросов.ВидТела;
	ЗаписьЛога.Таймаут = СтрокаДереваЗапросов.Таймаут;

	Если СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.Строка Тогда
		ЗаписьЛога.ТелоЗапросаСтрока = HTTPЗапрос.ПолучитьТелоКакСтроку();
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.Файл Тогда
		Если ДанныеФайлаТела <> Неопределено Тогда
			ЗаписьЛога.ТелоЗапросаИмяФайла = ДанныеФайлаТела.ПолноеИмя;
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.БезТела Тогда
	Иначе
		ДвоичныеДанныеТела = HTTPЗапрос.ПолучитьТелоКакДвоичныеДанные();
		ЗаписьЛога.ТелоЗапросаАдресДвоичныхДанных = ПоместитьВоВременноеХранилище(ДвоичныеДанныеТела,
																				  Форма.УникальныйИдентификатор);
		ЗаписьЛога.ТелоЗапросаДвоичныеДанныеСтрокой = Строка(ДвоичныеДанныеТела);
	КонецЕсли;

	ЗаписьЛога.Протокол = Протокол;

	// Прокси
	ЗаписьЛога.ИспользоватьПрокси = СтрокаДереваЗапросов.ИспользоватьПрокси;
	ЗаписьЛога.ПроксиСервер = СтрокаДереваЗапросов.ПроксиСервер;
	ЗаписьЛога.ПроксиПорт = СтрокаДереваЗапросов.ПроксиПорт;
	ЗаписьЛога.ПроксиПользователь = СтрокаДереваЗапросов.ПроксиПользователь;
	ЗаписьЛога.ПроксиПароль = СтрокаДереваЗапросов.ПроксиПароль;
	ЗаписьЛога.ПроксиАутентификацияОС = СтрокаДереваЗапросов.ПроксиАутентификацияОС;

	ЗаписьЛога.КодСостояния = ?(HTTPОтвет = Неопределено, 500, HTTPОтвет.КодСостояния);

	Если HTTPОтвет = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЗаписьЛога.ЗаголовкиОтвета = УИ_ОбщегоНазначенияКлиентСервер.ПолучитьСтрокуЗаголовковHTTP(HTTPОтвет.Заголовки);

	СтрокаТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
	Если ЗначениеЗаполнено(СтрокаТелоОтвета) Тогда
#Если Сервер Тогда
		Если НайтиНедопустимыеСимволыXML(СтрокаТелоОтвета) = 0 Тогда
			АдресТелаОтветаСтрокой = ПоместитьВоВременноеХранилище(СтрокаТелоОтвета, Форма.УникальныйИдентификатор);
		Иначе
			АдресТелаОтветаСтрокой = ПоместитьВоВременноеХранилище("Содержит недопустимые символы XML",
																   Форма.УникальныйИдентификатор);
		КонецЕсли;
#Иначе

			Попытка
				АдресТелаОтветаСтрокой = ПоместитьВоВременноеХранилище(СтрокаТелоОтвета, Форма.УникальныйИдентификатор);
			Исключение
				АдресТелаОтветаСтрокой = ПоместитьВоВременноеХранилище("Содержит недопустимые символы XML",
																	   Форма.УникальныйИдентификатор);
			КонецПопытки;
#КонецЕсли
		ЗаписьЛога.АдресТелаОтветаСтрокой = АдресТелаОтветаСтрокой;
	КонецЕсли;
	ДвоичныеДанныеОтвета = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
	Если ДвоичныеДанныеОтвета <> Неопределено Тогда
		ЗаписьЛога.ТелоОтветаАдресДвоичныхДанных = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОтвета,
			Форма.УникальныйИдентификатор);
		ЗаписьЛога.ТелоОтветаДвоичныеДанныеСтрокой = Строка(ДвоичныеДанныеОтвета);
	КонецЕсли;

	ИмяФайлаОтвета = HTTPОтвет.ПолучитьИмяФайлаТела();
	Если ИмяФайлаОтвета <> Неопределено Тогда
		Файл = Новый Файл(ИмяФайлаОтвета);
		Если Файл.Существует() Тогда
			ДвоичныеДанныеОтвета = Новый ДвоичныеДанные(ИмяФайлаОтвета);
			ЗаписьЛога.ТелоОтветаАдресДвоичныхДанных = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОтвета,
				Форма.УникальныйИдентификатор);
			ЗаписьЛога.ТелоОтветаДвоичныеДанныеСтрокой = Строка(ДвоичныеДанныеОтвета);
		КонецЕсли;
	КонецЕсли;
	
	СтрокаДереваЗапросов.ИсторияЗапросов.Сортировать("Дата Убыв");
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьРезультатЗапросаПоЗаписиИстории(Форма, СтрокаДереваЗапросов, СтрокаИсторииЗапросов = Неопределено)
	Если СтрокаИсторииЗапросов = Неопределено Тогда
		Форма.КодСостояния = 0;
		Форма.ЗаголовкиОтвета = "";
		Форма.ТелоОтветаСтрокой = "";
		Форма.ДлительностьВМилисекундах = 0;
		Форма.ТелоОтветаДвоичныеДанныеСтрокой = "";
		Форма.ТелоОтветаАдресДвоичныхДанных = "";

		Возврат;
	КонецЕсли;

	Форма.КодСостояния = СтрокаИсторииЗапросов.КодСостояния;
	Форма.ЗаголовкиОтвета = СтрокаИсторииЗапросов.ЗаголовкиОтвета;
	Если ЭтоАдресВременногоХранилища(СтрокаИсторииЗапросов.АдресТелаОтветаСтрокой) Тогда
		Форма.ТелоОтветаСтрокой = ПолучитьИзВременногоХранилища(СтрокаИсторииЗапросов.АдресТелаОтветаСтрокой);
	Иначе
		Форма.ТелоОтветаСтрокой = "";
	КонецЕсли;
	Форма.ДлительностьВМилисекундах = СтрокаИсторииЗапросов.ДлительностьВыполнения;
	Форма.КодСостояния = СтрокаИсторииЗапросов.КодСостояния;
	Форма.ТелоОтветаДвоичныеДанныеСтрокой = СтрокаИсторииЗапросов.ТелоОтветаДвоичныеДанныеСтрокой;
	Форма.ТелоОтветаАдресДвоичныхДанных = СтрокаИсторииЗапросов.ТелоОтветаАдресДвоичныхДанных;
КонецПроцедуры

#КонецОбласти

#Область СписокЗапросов

&НаКлиенте 
Процедура СохранитьДанныеЗапросаВДеревоЗапросов()
	Если УИ_ИдентификаторТекущейСтрокиЗапросов = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ТекДанные = ДеревоЗапросов.НайтиПоИдентификатору(УИ_ИдентификаторТекущейСтрокиЗапросов);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	//Заголовки 
	ТекДанные.Заголовки.Очистить();
	Если РедактированиеЗаголовковТаблицей Тогда
		Для Каждого СтрокаЗаголовка Из ТаблицаЗаголовковЗапроса Цикл
			НоваяСтрока = ТекДанные.Заголовки.Добавить();
			НоваяСтрока.Ключ = СтрокаЗаголовка.Ключ;
			НоваяСтрока.Значение = СтрокаЗаголовка.Значение;
			НоваяСтрока.Использование = СтрокаЗаголовка.Использование;
		КонецЦикла;
	Иначе
		Заголовки = УИ_ОбщегоНазначенияКлиентСервер.ЗаголовкиHTTPЗапросаИзСтроки(ЗаголовкиСтрока);
		Для Каждого КлючЗначение ИЗ Заголовки Цикл
			НоваяСтрока = ТекДанные.Заголовки.Добавить();
			НоваяСтрока.Ключ = КлючЗначение.Ключ;
			НоваяСтрока.Значение = КлючЗначение.Значение;
			НоваяСтрока.Использование = Истина;
		КонецЦикла;
	КонецЕсли;

	ТекДанные.АлгоритмПередВыполнением = УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "ПЕРЕДВЫПОЛНЕНИЕМ");
	ТекДанные.АлгоритмПослеВыполнения = УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "ПОСЛЕВЫПОЛНЕНИЯ");
	ТекДанные.ТелоСтрокой = УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "ТЕЛО");

//	ТекДанные.Текст = УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "Код");
//	ТекДанные.ИспользоватьОбработкуДляВыполненияКода = УИ_РедакторКодаКлиент.РежимИспользованияОбработкиДляВыполненияКодаРедактора(ЭтотОбъект,
//																																   "Код");
	
КонецПроцедуры

&НаКлиенте
Процедура ИзвлечьДанныеЗапросаИзСтрокиДерева()
	СтрокаДерева = ТекущаяСтрокаЗапросов();
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	//Заголовки 
	ТаблицаЗаголовковЗапроса.Очистить();
	ЗаголовкиСтрока = "";
	Если РедактированиеЗаголовковТаблицей Тогда
		Для Каждого Стр Из СтрокаДерева.Заголовки Цикл
			НоваяСтрока = ТаблицаЗаголовковЗапроса.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
		КонецЦикла;
	Иначе
		ЗаголовкиСтрока = СтрокаЗаголовковПоТаблице(СтрокаДерева.Заголовки);
	КонецЕсли;
	
	ТелоЗапросаДвоичныеДанныеСтрокой = "";
	Если СтрокаДерева.ТелоДвоичныеДанные <> Неопределено Тогда
		ХранилищеДвоичныхДанных = СтрокаДерева.ТелоДвоичныеДанные; //см. УИ_ОбщегоНазначенияКлиентСервер.НовыйХранилищеЗначенияТипаДвоичныеДанные
		ТелоЗапросаДвоичныеДанныеСтрокой = ХранилищеДвоичныхДанных.Представление;
	КонецЕсли;

	ПриИзмененииВидаТелаЗапроса();
	ПриИзмененииВидаАутентификацииЗапроса();

	Если СтрокаДерева.ИсторияЗапросов.Количество() > 0 Тогда
		ЗаполнитьРезультатЗапросаПоЗаписиИстории(ЭтотОбъект,
												 СтрокаДерева,
												 СтрокаДерева.ИсторияЗапросов[0]);
	Иначе
		ЗаполнитьРезультатЗапросаПоЗаписиИстории(ЭтотОбъект,
												 СтрокаДерева,
												 Неопределено);
		
	КонецЕсли;
	УстановитьПредварительныйURL(ЭтотОбъект, СтрокаДерева.ПолучитьИдентификатор());

	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект,
												   "ПЕРЕДВЫПОЛНЕНИЕМ",
												   СтрокаДерева.АлгоритмПередВыполнением);
	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект,
												   "ПОСЛЕВЫПОЛНЕНИЯ",
												   СтрокаДерева.АлгоритмПослеВыполнения);
	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект,
												   "ТЕЛО",
												   СтрокаДерева.ТелоСтрокой);
	УстановитьЯзыкРедактораТела(СтрокаДерева);
КонецПроцедуры



#КонецОбласти

#Область ПодготовкаЗапроса

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьТаблицуЗаголовковПоСтроке(СтрокаЗаголовков, ТаблицаЗаголовковЗапроса)
	ТаблицаЗаголовковЗапроса.Очистить();
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(СтрокаЗаголовков);
	Для НомерСтроки = 1 По ТекстовыйДокумент.КоличествоСтрок() Цикл
		ЗаголовокСтр = ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки);

		Если Не ЗначениеЗаполнено(ЗаголовокСтр) Тогда
			Продолжить;
		КонецЕсли;

		МассивЗаголовка = СтрРазделить(ЗаголовокСтр, ":");
		Если МассивЗаголовка.Количество() <> 2 Тогда
			Продолжить;
		КонецЕсли;

		НС = ТаблицаЗаголовковЗапроса.Добавить();
		НС.Ключ = МассивЗаголовка[0];
		НС.Значение = МассивЗаголовка[1];
		НС.Использование = Истина;

	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьСтраницуРедактированияЗаголовковЗапроса()
	Если РедактированиеЗаголовковТаблицей Тогда
		НоваяСтраница = Элементы.ГруппаСтраницаРедактированияЗаголовковЗапросаТаблицей;
	Иначе
		НоваяСтраница = Элементы.ГруппаСтраницаРедактированияЗаголовковЗапросаТекстом;
	КонецЕсли;

	Элементы.ГруппаСраницыРедактированияЗаголовковЗапроса.ТекущаяСтраница = НоваяСтраница;

	//Теперь нужно заполнить заголовки на новой странице по старой странице
	Если РедактированиеЗаголовковТаблицей Тогда
		ЗаполнитьТаблицуЗаголовковПоСтроке(ЗаголовкиСтрока, ТаблицаЗаголовковЗапроса);
	Иначе
		ЗаголовкиСтрока = СтрокаЗаголовковПоТаблице(ТаблицаЗаголовковЗапроса);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ИсполнениеЗапроса

// Новый параметры периодического исполнения запроса.
// 
// Возвращаемое значение:
//  Структура - Новый параметры периодического исполнения запроса:
// * Интервал - Число - 
// * Однократно - Булево - 
// * СтрокаЗапросов - Неопределено, Число - 
// * ОбработчикОжидания - Строка - 
// * ЕстьПодключенныйОбработчик - Булево - 
&НаКлиентеНаСервереБезКонтекста
Функция НовыйПараметрыПериодическогоИсполненияЗапроса()
	ПараметрыИсполнения = Новый Структура;
	ПараметрыИсполнения.Вставить("Интервал", 0);
	ПараметрыИсполнения.Вставить("Однократно", Ложь);
	ПараметрыИсполнения.Вставить("СтрокаЗапросов", Неопределено);
	ПараметрыИсполнения.Вставить("ОбработчикОжидания","");
	ПараметрыИсполнения.Вставить("ЕстьПодключенныйОбработчик", Ложь);
	
	Возврат ПараметрыИсполнения;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ВыполнитьАлгоритмПередВыполнениемЗапроса(СтрокаДерева, Соединение, Запрос, Отказ)
	Если Не ЗначениеЗаполнено(СтрокаДерева.АлгоритмПередВыполнением) Тогда
		Возврат;
	КонецЕсли;
	КонтекстВыполнения = Новый Структура;
	КонтекстВыполнения.Вставить("Соединение", Соединение);
	КонтекстВыполнения.Вставить("Запрос", Запрос);
	КонтекстВыполнения.Вставить("Отказ", Отказ);

	ПараметрыВыполненияАлгоритма = УИ_РедакторКодаКлиентСервер.НовыйПараметрыВыполненияАлгоритма();
	ПараметрыВыполненияАлгоритма.Текст = СтрокаДерева.АлгоритмПередВыполнением;
	ПараметрыВыполненияАлгоритма.ВходящиеПеременные = КонтекстВыполнения;
	ПараметрыВыполненияАлгоритма.ИсходящиеПеременные.Добавить("Соединение");
	ПараметрыВыполненияАлгоритма.ИсходящиеПеременные.Добавить("Запрос");
	ПараметрыВыполненияАлгоритма.ИсходящиеПеременные.Добавить("Отказ");
	
	ПараметрыВыполненияАлгоритма.ВозвращатьЗначенияПеременных = Истина;
	ПараметрыВыполненияАлгоритма.ИсполнениеНаКлиенте = СтрокаДерева.НаКлиенте;

	РезультатВыполнения = УИ_РедакторКодаКлиентСервер.РезультатВыполненияАлгоритма(ПараметрыВыполненияАлгоритма);
																		
	Если Не РезультатВыполнения.Успешно Тогда
		Отказ = Истина;
	Иначе
		Отказ = РезультатВыполнения.ЗначенияПеременных.Отказ = Истина;
	КонецЕсли;
	
	Соединение = РезультатВыполнения.ЗначенияПеременных.Соединение;
	Запрос = РезультатВыполнения.ЗначенияПеременных.Запрос;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ВыполнитьАлгоритмПослеВыполненияЗапроса(СтрокаДерева, Соединение, Запрос, Ответ)
	Если Не ЗначениеЗаполнено(СтрокаДерева.АлгоритмПослеВыполнения) Тогда
		Возврат;
	КонецЕсли;
	КонтекстВыполнения = Новый Структура;
	КонтекстВыполнения.Вставить("Соединение", Соединение);
	КонтекстВыполнения.Вставить("Запрос", Запрос);
	КонтекстВыполнения.Вставить("Ответ", Ответ);

	ПараметрыВыполненияАлгоритма = УИ_РедакторКодаКлиентСервер.НовыйПараметрыВыполненияАлгоритма();
	ПараметрыВыполненияАлгоритма.Текст = СтрокаДерева.АлгоритмПослеВыполнения;
	ПараметрыВыполненияАлгоритма.ВходящиеПеременные = КонтекстВыполнения;
	
	ПараметрыВыполненияАлгоритма.ИсполнениеНаКлиенте = СтрокаДерева.НаКлиенте;

	УИ_РедакторКодаКлиентСервер.РезультатВыполненияАлгоритма(ПараметрыВыполненияАлгоритма);
																		
КонецПроцедуры

// Выполнить запрос на клиенте на сервере.
// 
// Параметры:
//  Форма - см. Обработка.УИ_КонсольHTTPЗапросов.Форма.Форма
//  СтрокаДерева - ДанныеФормыЭлементДерева - Строка дерева
//  ДанныеФайлаТела - Структура, Неопределено - Данные файла тела:
// * Хранение - Строка - 
// * ПолноеИмя - Строка - 
&НаКлиентеНаСервереБезКонтекста
Процедура ВыполнитьЗапросНаКлиентеНаСервере(Форма, СтрокаДерева, ДанныеФайлаТела = Неопределено)
	URLДляИсполнения = URLДляИсполнения(СтрокаДерева, Форма.Переменные);
	СтруктураURL = УИ_КоннекторHTTP.РазобратьURL(URLДляИсполнения);

	СоединениеHTTP = ПодготовленноеСоединение(Форма, СтрокаДерева, СтруктураURL);

	НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Запрос = ПодготовленныйЗапросHTTP(Форма, СтрокаДерева, СтруктураURL, ДанныеФайлаТела);

	Отказ = Ложь;
	ВыполнитьАлгоритмПередВыполнениемЗапроса(СтрокаДерева, СоединениеHTTP, Запрос, Отказ);

	Если Отказ Тогда
		Возврат;
	КонецЕсли;
#Если НаКлиенте Тогда
	//@skip-check use-non-recommended-method
	ДатаНачала = ТекущаяДата();
	#Иначе
	ДатаНачала = ТекущаяДатаСеанса();
	#КонецЕсли
	
	ПараметрыОбработкиРезультатаВыполненияЗапроса = Новый Структура;
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("Форма", Форма);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("СтрокаДерева", СтрокаДерева);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("СоединениеHTTP", СоединениеHTTP);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("Запрос", Запрос);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("НачалоВыполнения", НачалоВыполнения);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("ДатаНачала", ДатаНачала);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("URLДляИсполнения", URLДляИсполнения);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("СтруктураURL", СтруктураURL);
	ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("ДанныеФайлаТела", ДанныеФайлаТела);
	
	Попытка
		Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.21")
			 И СтрокаДерева.НаКлиенте Тогда
			Если СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.GET Тогда
				Ответ = СоединениеHTTP.ПолучитьАсинх(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.POST Тогда
				Ответ = СоединениеHTTP.ОтправитьДляОбработкиАсинх(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.DELETE Тогда
				Ответ = СоединениеHTTP.УдалитьАсинх(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.PUT Тогда
				Ответ = СоединениеHTTP.ЗаписатьАсинх(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.PATCH Тогда
				Ответ = СоединениеHTTP.ИзменитьАсинх(Запрос);
			Иначе
				Ответ = СоединениеHTTP.ВызватьHTTPМетодАсинх(СтрокаДерева.ЗапросHTTP, Запрос);
			КонецЕсли;
#Если Клиент Тогда
			ОповещениеОЗавершенииВыполненияЗапроса = Новый ОписаниеОповещения("ПослеВыполненияЗапросаНаКлиенте", Форма,
				ПараметрыОбработкиРезультатаВыполненияЗапроса);

			УИ_МетодыСовмеcтимостиПлатформы_8_3_18Клиент.ЗадатьОповещениеДляОбещания(Ответ,
																					 ОповещениеОЗавершенииВыполненияЗапроса);
			Возврат;
#КонецЕсли
		Иначе
			Если СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.GET Тогда
				Ответ = СоединениеHTTP.Получить(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.POST Тогда
				Ответ = СоединениеHTTP.ОтправитьДляОбработки(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.DELETE Тогда
				Ответ = СоединениеHTTP.Удалить(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.PUT Тогда
				Ответ = СоединениеHTTP.Записать(Запрос);
			ИначеЕсли СтрокаДерева.ЗапросHTTP = Форма.ВидыHTTPМетодов.PATCH Тогда
				Ответ = СоединениеHTTP.Изменить(Запрос);
			Иначе
				Ответ = СоединениеHTTP.ВызватьHTTPМетод(СтрокаДерева.ЗапросHTTP, Запрос);
			КонецЕсли;
			ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("Ответ", Ответ);
		КонецЕсли;
	Исключение
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
		
		ПараметрыОбработкиРезультатаВыполненияЗапроса.Вставить("Ответ", Неопределено);
	КонецПопытки;
	ПослеВыполненияЗапросаНаКлиентеНаСервере(ПараметрыОбработкиРезультатаВыполненияЗапроса);

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапросНаКлиенте(ИдентификаторСтрокиДерева, ДанныеФайлаТела = Неопределено)
	СтрокаДерева = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтрокиДерева);
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьЗапросНаКлиентеНаСервере(ЭтотОбъект, СтрокаДерева, ДанныеФайлаТела);
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьЗапросНаСервере(ИдентификаторСтрокиДерева, ДанныеФайлаТела = Неопределено)
	СтрокаДерева = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтрокиДерева);
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьЗапросНаКлиентеНаСервере(ЭтотОбъект, СтрокаДерева, ДанныеФайлаТела);
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПодготовленноеСоединение(Форма, СтрокаДереваЗапросов, СтруктураURL)
	Порт = Неопределено;
	Если ЗначениеЗаполнено(СтруктураURL.Порт) Тогда
		Порт = СтруктураURL.Порт;
	КонецЕсли;
		
	НастройкаПрокси = Неопределено;
	Если СтрокаДереваЗапросов.ИспользоватьПрокси Тогда
#Если Не ВебКлиент Тогда
		НастройкаПрокси = Новый ИнтернетПрокси(Истина);
		НастройкаПрокси.Установить(СтруктураURL.Схема,
								   СтрокаДереваЗапросов.ПроксиСервер,
								   СтрокаДереваЗапросов.ПроксиПорт,
								   СтрокаДереваЗапросов.ПроксиПользователь,
								   СтрокаДереваЗапросов.ПроксиПароль,
								   СтрокаДереваЗапросов.ПроксиАутентификацияОС);
#КонецЕсли
	КонецЕсли;


	ВидыАутентификации = ВидыАутентификации();
	ИспользоватьNTMLАутентификацию = Неопределено;
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.7") Тогда
		Если СтрокаДереваЗапросов.АутентификацияИспользовать
			 И СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.NTML Тогда
			ИспользоватьNTMLАутентификацию = Истина;
		КонецЕсли;
	КонецЕсли;

	Пользователь = Неопределено;
	Пароль = Неопределено;
	Если СтрокаДереваЗапросов.АутентификацияИспользовать
		 И СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.Базовая1С Тогда
		Пользователь = СтрокаДереваЗапросов.АутентификацияПользователь;
		Пароль = СтрокаДереваЗапросов.АутентификацияПароль;
	КонецЕсли;

	ЗащищенноеСоединение = Неопределено;
	Если НРег(СтруктураURL.Схема) = "https" Тогда
		ЗащищенноеСоединение = УИ_МетодыСовместимостиПлатформы_8_3_21КлиентСервер.НовыйЗащищенноеСоединениеOpenSSL();
	КонецЕсли;

	Возврат УИ_МетодыСовместимостиПлатформы_8_3_21КлиентСервер.НовыйHTTPСоединение(СтруктураURL.Сервер,
																				   Порт,
																				   Пользователь,
																				   Пароль,
																				   НастройкаПрокси,
																				   СтрокаДереваЗапросов.Таймаут,
																				   ЗащищенноеСоединение,
																				   ИспользоватьNTMLАутентификацию);

КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ПодготовленныйЗапросHTTP(Форма, СтрокаДереваЗапросов, СтруктураURL, ДанныеФайлаТела)
	Заголовки = Новый Соответствие;

	СтрокаЗапроса = СтруктураURL.Путь;

	СтрокаПараметров = "";
	Для Каждого КлючЗначение Из СтруктураURL.ПараметрыЗапроса Цикл
		СтрокаПараметров = СтрокаПараметров
						   + ?(Не ЗначениеЗаполнено(СтрокаПараметров), "?", "&")
						   + КлючЗначение.Ключ
						   + "="
						   + КлючЗначение.Значение;
	КонецЦикла;

	АдресРесурса = СтрокаЗапроса + СтрокаПараметров;
	
	ТелоПараметры = Новый Структура;
	ТелоПараметры.Вставить("Тело", Неопределено);
	ТелоПараметры.Вставить("ТелоКодировка", Неопределено);
	ТелоПараметры.Вставить("ТелоБОМ", Неопределено);
	
	Если СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.БезТела Тогда
		//Ничего не делаем. тела нету
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.Строка Тогда
		Если ЗначениеЗаполнено(СтрокаДереваЗапросов.ТелоСтрокой) Тогда
#Если ВебКлиент Тогда
			БОМ = Неопределено;
			Если СтрокаДереваЗапросов.ИспользоватьBOM <> 0 Тогда
				УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Настройка использования BOM игнорируется на веб клиенте");
			КонецЕсли;
#Иначе
				Если СтрокаДереваЗапросов.ИспользоватьBOM = 0 Тогда
					БОМ = ИспользованиеByteOrderMark.Авто;
				ИначеЕсли (СтрокаДереваЗапросов.ИспользоватьBOM = 1) Тогда
					БОМ = ИспользованиеByteOrderMark.Использовать;
				Иначе
					БОМ = ИспользованиеByteOrderMark.НеИспользовать;
				КонецЕсли;
#КонецЕсли                
			ТелоПараметры.ТелоБОМ = БОМ;
			БезКодировкиТекста = СтрокаДереваЗапросов.КодировкаТела = "Авто";
#Если ВебКлиент Тогда
			Если Не БезКодировкиТекста Тогда
				БезКодировкиТекста = Истина;
				УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("При запросе в вебклиенте тело устанавливается в кодровке UTF-8 и настройка кодировки игнорируется");
			КонецЕсли;

#КонецЕсли
			ТелоПараметры.Тело = СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.ТелоСтрокой,
																		   Форма.Переменные);

			Если Не БезКодировкиТекста Тогда
				Попытка
					КодировкаТела = УИ_МетодыСовместимостиПлатформы_8_3_21КлиентСервер.КодировкаТекстаПоИмени(СтрокаДереваЗапросов.КодировкаТела);
				Исключение
					КодировкаТела = СтрокаДереваЗапросов.КодировкаТела;
				КонецПопытки;
				ТелоПараметры.ТелоКодировка = КодировкаТела;
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.ДвоичныеДанные Тогда
		Если СтрокаДереваЗапросов.ТелоДвоичныеДанные <> Неопределено Тогда
			ДвоичныеДанныеТела = УИ_ОбщегоНазначения.ЗначениеИзХранилищаКонтейнераДвоичныхДанных(СтрокаДереваЗапросов.ТелоДвоичныеДанные);
			
			Если ТипЗнч(ДвоичныеДанныеТела) = Тип("ДвоичныеДанные") Тогда 
				ТелоПараметры.Тело = ДвоичныеДанныеТела;	
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.МультипартФорм Тогда
		ВидыЭлементовМультипарт = ВидыЭлементовМультипарт();
		РазделительСтрокДляЗапросаMultipart = РазделительСтрокДляЗапросаMultipart();
		
		ФайлыДляОбъединения = Новый Массив;
		Для ИндексСтроки = 0 По СтрокаДереваЗапросов.ТелоМультипарт.Количество() - 1 Цикл
			СтрокаЭлементаМультипарт = СтрокаДереваЗапросов.ТелоМультипарт[ИндексСтроки];
			Если Не СтрокаЭлементаМультипарт.Использование Тогда
				Продолжить;
			КонецЕсли;
			
			Если СтрокаЭлементаМультипарт.Вид = ВидыЭлементовМультипарт.Строка Тогда

				ВходнойФайл = ""
							  + РазделительСтрокДляЗапросаMultipart
							  + "--"
							  + Форма.РазделительТелаМультипарт
							  + РазделительСтрокДляЗапросаMultipart
							  + "Content-Disposition: form-data;name="""
							  + СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Имя, Форма.Переменные)
							  + """"
							  + РазделительСтрокДляЗапросаMultipart + РазделительСтрокДляЗапросаMultipart;

				ФайлыДляОбъединения.Добавить(ПолучитьДвоичныеДанныеИзСтроки(ВходнойФайл));

				ФайлыДляОбъединения.Добавить(ПолучитьДвоичныеДанныеИзСтроки(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Значение,
																													  Форма.Переменные)));

			ИначеЕсли СтрокаЭлементаМультипарт.Вид = ВидыЭлементовМультипарт.Файл Тогда
				Если Не ЗначениеЗаполнено(СтрокаЭлементаМультипарт.Значение) Тогда
					Продолжить;
				КонецЕсли;

				СтруктураФайла = ДанныеФайлаТела[ИндексСтроки];
				Если СтруктураФайла = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				Если Не ЭтоАдресВременногоХранилища(СтруктураФайла.Хранение) Тогда
					Продолжить;
				КонецЕсли;


				Файл = Новый Файл(СтруктураФайла.ПолноеИмя);

				ВходнойФайл = ""
							  + РазделительСтрокДляЗапросаMultipart
							  + "--"
							  + Форма.РазделительТелаМультипарт
							  + РазделительСтрокДляЗапросаMultipart
							  + "Content-Disposition: form-data;name="""
							  + СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Имя, Форма.Переменные)
							  + """;filename="""
							  + Файл.Имя
							  + """"
							  + РазделительСтрокДляЗапросаMultipart
							  + "Content-Type: application/octet-stream"
							  + РазделительСтрокДляЗапросаMultipart
							  + РазделительСтрокДляЗапросаMultipart;

				ФайлыДляОбъединения.Добавить(ПолучитьДвоичныеДанныеИзСтроки(ВходнойФайл));
				ФайлыДляОбъединения.Добавить(ПолучитьИзВременногоХранилища(СтруктураФайла.Хранение));
			КонецЕсли;
				
		КонецЦикла;

		ВходнойФайл = ""
					  + РазделительСтрокДляЗапросаMultipart
					  + "--"
					  + Форма.РазделительТелаМультипарт
					  + "--"
					  + РазделительСтрокДляЗапросаMultipart;

		ФайлыДляОбъединения.Добавить(ПолучитьДвоичныеДанныеИзСтроки(ВходнойФайл));

		ФинальныеДД = СоединитьДвоичныеДанные(ФайлыДляОбъединения);

		РазмерФайлаОтправки = Формат(ФинальныеДД.Размер(), "ЧГ=0;");
		ТелоПараметры.Тело = ФинальныеДД;
		
		Заголовки.Вставить("Content-Length", РазмерФайлаОтправки);		
	Иначе
		Если СтрокаДереваЗапросов.НаКлиенте Тогда      
			ТелоПараметры.Тело = ДанныеФайлаТела.ПолноеИмя;
		Иначе
#Если Не ВебКлиент Тогда
			ДвоичныеДанныеТела = ПолучитьИзВременногоХранилища(ДанныеФайлаТела.Хранение);
			Если ТипЗнч(ДвоичныеДанныеТела) = Тип("ДвоичныеДанные") Тогда
				Файл = Новый Файл(ДанныеФайлаТела.ПолноеИмя);
			//@skip-check missing-temporary-file-deletion
				ВременныйФайл = ПолучитьИмяВременногоФайла(Файл.Расширение);
				ДвоичныеДанныеТела.Записать(ВременныйФайл);

				ТелоПараметры.Тело = ВременныйФайл;

				Заголовки.Вставить("Content-Length", Формат(ДвоичныеДанныеТела.Размер(), "ЧГ=0;"));

			КонецЕсли;
#КонецЕсли
		КонецЕсли;
	КонецЕсли;

	//Теперь нужно установить заголовки запроса

	Для Каждого СтрокаЗаголовка Из СтрокаДереваЗапросов.Заголовки Цикл
		Если Не СтрокаЗаголовка.Использование Тогда
			Продолжить;
		КонецЕсли;
		Заголовки.Вставить(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЗаголовка.Ключ, Форма.Переменные),
						   СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЗаголовка.Значение, Форма.Переменные));
	КонецЦикла;

	УстановитьЗаголовокАутентификацииВЗапросHTTP(Форма, СтрокаДереваЗапросов, Заголовки);
	НовыйЗапрос = УИ_МетодыСовместимостиПлатформы_8_3_21КлиентСервер.НовыйHTTPЗапрос(АдресРесурса, Заголовки);
	
	Если СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.Строка Тогда
		Если ТелоПараметры.ТелоКодировка = Неопределено Тогда
			//@skip-check unknown-method-property
			НовыйЗапрос.УстановитьТелоИзСтроки(ТелоПараметры.Тело, , ТелоПараметры.ТелоБОМ);
		Иначе
			//@skip-check unknown-method-property
			НовыйЗапрос.УстановитьТелоИзСтроки(ТелоПараметры.Тело, ТелоПараметры.ТелоКодировка, ТелоПараметры.ТелоБОМ);
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.ДвоичныеДанные Тогда
		Если ТипЗнч(ТелоПараметры.Тело) = Тип("ДвоичныеДанные") Тогда
			//@skip-check unknown-method-property
			НовыйЗапрос.УстановитьТелоИзДвоичныхДанных(ТелоПараметры.Тело);
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.МультипартФорм Тогда
		//@skip-check unknown-method-property
		НовыйЗапрос.УстановитьТелоИзДвоичныхДанных(ТелоПараметры.Тело);
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.Файл Тогда
		Если ТелоПараметры.Тело <> Неопределено Тогда
			//@skip-check unknown-method-property
			НовыйЗапрос.УстановитьИмяФайлаТела(ТелоПараметры.Тело);
		КонецЕсли;
	КонецЕсли;
	Возврат НовыйЗапрос;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЗаголовокАутентификацииВЗапросHTTP(Форма, СтрокаДереваЗапросов, ЗаголовкиЗапроса)
	Виды = ВидыАутентификации();
	Если Не ЗначениеЗаполнено(СтрокаДереваЗапросов.АутентификацияВид)
		 Или СтрокаДереваЗапросов.АутентификацияВид = Виды.Нет
		 Или СтрокаДереваЗапросов.АутентификацияВид = Виды.Базовая1С Тогда
		Возврат;
	КонецЕсли;
	
	Если Не СтрокаДереваЗапросов.АутентификацияИспользовать Тогда
		Возврат;
	КонецЕсли;
	
	ИмяЗаголовка = "Authorization";
	Если ЗаголовкиЗапроса.Получить(ИмяЗаголовка) <> Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеЗаголовка = "";
	
	Если СтрокаДереваЗапросов.АутентификацияВид = Виды.Базовая Тогда
		Префикс = "Basic";

		СтрокаДляПреобразованияВBase64 = СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПользователь,
																				   Форма.Переменные)
										 + ":"
										 + СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПароль,
																					 Форма.Переменные);

		СтрокаBase64 =  ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(СтрокаДляПреобразованияВBase64));

		ЗначениеЗаголовка = Префикс + " " +  СтрЗаменить(СтрокаBase64, Символы.ВК + Символы.ПС, "");

	ИначеЕсли СтрокаДереваЗапросов.АутентификацияВид = Виды.BearerToken Тогда
		Префикс = СокрЛП(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПрефиксТокена,
																   Форма.Переменные));
		Если Не ЗначениеЗаполнено(Префикс) Тогда
			Префикс = "Bearer";
		КонецЕсли;
		ЗначениеЗаголовка = Префикс
							+ " "
							+ СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПароль,
																		Форма.Переменные);
	Иначе
		Возврат;
	КонецЕсли;
	
	ЗаголовкиЗапроса.Вставить(ИмяЗаголовка, ЗначениеЗаголовка);
КонецПроцедуры

// После выполнения запроса на клиенте на сервере.
// 
// Параметры:
//  ДополнительныеПараметры - Структура -  Дополнительные параметры:
// * Форма - УправляемаяФорма - 
// * СтрокаДерева - ДанныеФормыЭлементДерева - 
// * СоединениеHTTP - HTTPСоединение - 
// * Запрос - HTTPЗапрос - 
// * НачалоВыполнения - Число - 
// * ДатаНачала - Дата - 
// * URLДляИсполнения - Строка -
// * СтруктураURL - Структура - :
// ** Схема - Строка - 
// ** Аутентификация - Структура - :
// *** Пользователь - Строка - 
// *** Пароль - Строка - 
// ** Сервер - Строка - 
// ** Порт - Число - 
// ** Путь - Строка, Число - 
// ** ПараметрыЗапроса - Соответствие - 
// ** Фрагмент - Строка - 
// * ДанныеФайлаТела - Структура, Неопределено - :
// ** Хранение - Строка - 
// ** ПолноеИмя - Строка - 
// * Ответ - HTTPОтвет - 
&НаКлиентеНаСервереБезКонтекста
Процедура ПослеВыполненияЗапросаНаКлиентеНаСервере(ДополнительныеПараметры)
	ОкончаниеВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();

	ДлительностьВМилисекундах = ОкончаниеВыполнения - ДополнительныеПараметры.НачалоВыполнения;

	ЗафиксироватьЛогЗапроса(ДополнительныеПараметры.Форма,
							ДополнительныеПараметры.СтрокаДерева,
							ДополнительныеПараметры.URLДляИсполнения,
							ДополнительныеПараметры.СтруктураURL.Сервер,
							ДополнительныеПараметры.СтруктураURL.Схема,
							ДополнительныеПараметры.Запрос,
							ДополнительныеПараметры.Ответ,
							ДополнительныеПараметры.ДатаНачала,
							ДлительностьВМилисекундах,
							ДополнительныеПараметры.ДанныеФайлаТела);

	ЗаполнитьРезультатЗапросаПоЗаписиИстории(ДополнительныеПараметры.Форма,
											 ДополнительныеПараметры.СтрокаДерева,
											 ДополнительныеПараметры.СтрокаДерева.ИсторияЗапросов[0]);

	ДополнитьСписокИспользованныхРанееЗаголовков(ДополнительныеПараметры.Форма,
												 ДополнительныеПараметры.Запрос.Заголовки);

	ВыполнитьАлгоритмПослеВыполненияЗапроса(ДополнительныеПараметры.СтрокаДерева,
											ДополнительныеПараметры.СоединениеHTTP,
											ДополнительныеПараметры.Запрос,
											ДополнительныеПараметры.Ответ);

	ИмяФайлаТела = ДополнительныеПараметры.Запрос.ПолучитьИмяФайлаТела();
	Если ИмяФайлаТела <> Неопределено Тогда
		//@skip-check empty-except-statement
		Попытка
			УдалитьФайлы(ИмяФайлаТела);
		Исключение
		КонецПопытки;
	КонецЕсли;
	Если ДополнительныеПараметры.ДанныеФайлаТела <> Неопределено Тогда
		Если ТипЗнч(ДополнительныеПараметры.ДанныеФайлаТела) = Тип("Структура") Тогда
		//@skip-check empty-except-statement
			Попытка
				УдалитьИзВременногоХранилища(ДополнительныеПараметры.ДанныеФайлаТела.Хранение);
			Исключение
			КонецПопытки;
		ИначеЕсли ТипЗнч(ДополнительныеПараметры.ДанныеФайлаТела) = Тип("Соответствие") Тогда
			Для Каждого КлючЗначение Из ДополнительныеПараметры.ДанныеФайлаТела Цикл
				Если ТипЗнч(КлючЗначение.Значение) = Тип("Структура") Тогда
					АдресДляУдаления = КлючЗначение.Значение.Хранение;
				Иначе
					АдресДляУдаления = КлючЗначение.Значение;
				КонецЕсли;
				
			//@skip-check empty-except-statement
				Попытка
					УдалитьИзВременногоХранилища(АдресДляУдаления);
				Исключение
				КонецПопытки;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	
КонецПроцедуры

&НаКлиенте 
Процедура ПослеВыполненияЗапросаНаКлиенте(ОтветСервера, ДополнительныеПараметры) Экспорт
	Если ТипЗнч(ОтветСервера) = Тип("ИнформацияОбОшибке") Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОтветСервера.Описание);
		Ответ = Неопределено;
	Иначе
		Ответ = ОтветСервера;
	КонецЕсли;
		
	ДополнительныеПараметры.Вставить("Ответ", Ответ);
	
	ПослеВыполненияЗапросаНаКлиентеНаСервере(ДополнительныеПараметры);	
	ЗавершитьОчереднуюИтерациюПериодическогоИсполненияЗапроса();	

КонецПроцедуры

#Область ПериодическоеВыполнениеЗапросов

&НаКлиенте
Процедура ПодключитьОчереднойОбработчикОжиданияПериодическогоИсполненияЗапроса()
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.ЕстьПодключенныйОбработчик = Истина;
	ПодключитьОбработчикОжидания(УИ_ПараметрыПериодическогоИсполненияЗапроса.ОбработчикОжидания,
								 УИ_ПараметрыПериодическогоИсполненияЗапроса.Интервал,
								 Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьОкончаниеОжиданияОчередногоОбработчикаОжиданияПериодическогоИсполненияЗапроса()
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.ЕстьПодключенныйОбработчик = Ложь;
	
КонецПроцедуры

&НаКлиенте 
Процедура НачатьПериодическоеИсполненияЗапроса()
	Элементы.ФормаГруппаКнопокВыполнить.Доступность = Ложь;
	
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса <> Неопределено Тогда
		Если Не УИ_ПараметрыПериодическогоИсполненияЗапроса.Однократно Тогда
			Элементы.ФормаОстановитьПериодическоеВыполенение.Видимость = Истина;
		КонецЕсли;
	КонецЕсли;
	ПодключитьОчереднойОбработчикОжиданияПериодическогоИсполненияЗапроса();

КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьПериодическоеИсполнениеЗапроса()
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ФормаГруппаКнопокВыполнить.Доступность = Истина;
	Элементы.ФормаОстановитьПериодическоеВыполенение.Видимость = Ложь;
	
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса.ЕстьПодключенныйОбработчик Тогда
		ОтключитьОбработчикОжидания(УИ_ПараметрыПериодическогоИсполненияЗапроса.ОбработчикОжидания);
	КонецЕсли;	
	
	УИ_ПараметрыПериодическогоИсполненияЗапроса = Неопределено;
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьОчереднуюИтерациюПериодическогоИсполненияЗапроса()
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса = Неопределено Тогда
		ЗавершитьПериодическоеИсполнениеЗапроса();
		Возврат;
	КонецЕсли;
	
	Если УИ_ПараметрыПериодическогоИсполненияЗапроса.Однократно Тогда
		ЗавершитьПериодическоеИсполнениеЗапроса();
	Иначе
		ПодключитьОчереднойОбработчикОжиданияПериодическогоИсполненияЗапроса();
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапросСЗадержкойЗавершениеВводаЗадержки(Число, ДополнительныеПараметры) Экспорт
	Если Число = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;	
	
	Если Число<=0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Задержка должна быть положительным числом");
		Возврат;
	КонецЕсли;
	
	УИ_ПараметрыПериодическогоИсполненияЗапроса = НовыйПараметрыПериодическогоИсполненияЗапроса();
	УИ_ПараметрыПериодическогоИсполненияЗапроса.Интервал = Число;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.Однократно = Истина;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.СтрокаЗапросов = УИ_ИдентификаторТекущейСтрокиЗапросов;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.ОбработчикОжидания = "ОбработчикОжиданияПериодическогоИсполненияЗапроса";
	
	НачатьПериодическоеИсполненияЗапроса();
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьСПериодичностьюЗавершениеВводаПериодичности(Число, ДополнительныеПараметры) Экспорт
	Если Число = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Число <= 0 Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Периодичность выполнения запроса должна быть положительным числом");
		Возврат;
	КонецЕсли;
	
	УИ_ПараметрыПериодическогоИсполненияЗапроса = НовыйПараметрыПериодическогоИсполненияЗапроса();
	УИ_ПараметрыПериодическогоИсполненияЗапроса.Интервал = Число;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.Однократно = Ложь;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.СтрокаЗапросов = УИ_ИдентификаторТекущейСтрокиЗапросов;
	УИ_ПараметрыПериодическогоИсполненияЗапроса.ОбработчикОжидания = "ОбработчикОжиданияПериодическогоИсполненияЗапроса";
	
	НачатьПериодическоеИсполненияЗапроса();
КонецПроцедуры

//@skip-check module-unused-method
&НаКлиенте
Процедура ОбработчикОжиданияПериодическогоИсполненияЗапроса()
	ОбработатьОкончаниеОжиданияОчередногоОбработчикаОжиданияПериодическогоИсполненияЗапроса();
	ОбработчикВыполненияЗапроса();
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область РезультатЗапроса

#КонецОбласти

#Область НаборыПеременных

&НаКлиенте
Процедура СохранитьЗначенияПеременныхВТекущийНаборДанных()
	ТекДанныеНабора = НаборыЗначенийПеременных.НайтиПоИдентификатору(ТекущийНаборЗначенийПеременных);
	Если ТекДанныеНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	ТекДанныеНабора.Переменные.Очистить();
	
	Для Каждого Стр Из Переменные Цикл
		НоваяСтрока = ТекДанныеНабора.Переменные.Добавить();
		НоваяСтрока.Имя = Стр.Имя;
		НоваяСтрока.Значение = Стр.Значение;	
	КонецЦикла;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ПриИзмененииТекущегоНабораПеременных(Форма)
	ТекСтрокаНабора = Форма.НаборыЗначенийПеременных.НайтиПоИдентификатору(Форма.ТекущийНаборЗначенийПеременных);
	Если ТекСтрокаНабора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Стр Из Форма.Переменные Цикл
		Стр.Значение = Неопределено;
	КонецЦикла;
		
	Для Каждого Стр Из ТекСтрокаНабора.Переменные Цикл
		СтруктураПоиска = Новый Структура;
		СтруктураПоиска.Вставить("Имя", Стр.Имя);
		
		НайденныеСтроки = Форма.Переменные.НайтиСтроки(СтруктураПоиска);
		Если НайденныеСтроки.Количество() = 0 Тогда
			СтрокаПеременных = Форма.Переменные.Добавить();
			СтрокаПеременных.Имя = Стр.Имя;
		Иначе
			СтрокаПеременных = НайденныеСтроки[0];
		КонецЕсли;
		
		СтрокаПеременных.Значение = Стр.Значение;
	КонецЦикла;
	
	УстановитьПредварительныйURL(Форма, Форма.Элементы.ДеревоЗапросов.ТекущаяСтрока);
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Процедура ИнициализироватьСтрокуНаборПеременных(СтрокаНабора, Форма)
	Если Не ЗначениеЗаполнено(СтрокаНабора.Имя) Тогда
		СтрокаНабора.Имя = "Набор" + Формат(СтрокаНабора.ПолучитьИдентификатор(), "ЧГ=0;");
	КонецЕсли;
КонецПроцедуры


&НаСервере
Процедура ДобавитьПеременнуюПриНеобходимости(ИмяПеременной)
	СтруктураПоиска = Новый Структура;
	СтруктураПоиска.Вставить("Имя", ИмяПеременной);

	НайденныеСтроки = Переменные.НайтиСтроки(СтруктураПоиска);
	Если НайденныеСтроки.Количество() = 0 Тогда
		НоваяПеременная = Переменные.Добавить();
		НоваяПеременная.Имя = ИмяПеременной;
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область Общее

&НаКлиенте
Процедура УстановитьЯзыкРедактораТела(СтрокаДерева)
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если СтрокаДерева.ВидТела <> ВидыТелаЗапроса.Строка Тогда
		Возврат;
	КонецЕсли;

	Если СтрокаДерева.ТипСтроковогоСодержимого = "json" Тогда
		УИ_РедакторКодаКлиент.УстановитьЯзыкРедактораКода(ЭтотОбъект, "ТЕЛО", "json");
	ИначеЕсли СтрокаДерева.ТипСтроковогоСодержимого = "xml" Тогда
		УИ_РедакторКодаКлиент.УстановитьЯзыкРедактораКода(ЭтотОбъект, "ТЕЛО", "xml");
	ИначеЕсли СтрокаДерева.ТипСтроковогоСодержимого = "yaml" Тогда
		УИ_РедакторКодаКлиент.УстановитьЯзыкРедактораКода(ЭтотОбъект, "ТЕЛО", "yaml");
	Иначе
		УИ_РедакторКодаКлиент.УстановитьЯзыкРедактораКода(ЭтотОбъект, "ТЕЛО", "plain_text");
	КонецЕсли;
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ЕстьПеременныеВСтроке(СтрокаДляПроверки)
	Возврат СтрНайти(СтрокаДляПроверки, "}}") >0 И СтрНайти(СтрокаДляПроверки, "{{") > 0;
КонецФункции 

&НаКлиентеНаСервереБезКонтекста
Функция СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДляУстановки, ЗначенияПеременных)
	Если Не ЕстьПеременныеВСтроке(СтрокаДляУстановки) Тогда
		Возврат СтрокаДляУстановки;
	КонецЕсли;
			
	НоваяСтрока = СтрокаДляУстановки;
	Для Каждого ТекСтр Из ЗначенияПеременных Цикл
		НоваяСтрока = СтрЗаменить(НоваяСтрока, "{{" + ТекСтр.Имя + "}}", Формат(ТекСтр.Значение,
																			  "ЧГ=0; БЛ=false; БИ=true;"));
	КонецЦикла;

	Возврат НоваяСтрока;
КонецФункции

&НаСервереБезКонтекста
Функция URLДляИсполненияСЗакодированнымиПараметрами(URL, Параметры)
	Возврат УИ_КоннекторHTTP.УИ_ПодготовленныйURL(URL, Параметры);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция URLДляИсполнения(СтрокаДереваЗапросов, ТаблицаПеременных)
	ПараметрыURL = Новый Соответствие;

	Для Каждого Стр Из СтрокаДереваЗапросов.ПараметрыURL Цикл
		Если Не Стр.Использование Тогда
			Продолжить;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(Стр.Имя) Тогда
			Продолжить;
		КонецЕсли;
		Имя = СтрокаСУстановленнымиЗначениямиПеременных(Стр.Имя, ТаблицаПеременных);

		МассивИмени = ПараметрыURL[Имя];
		Если МассивИмени = Неопределено Тогда
			ПараметрыURL.Вставить(Имя, Новый Массив);
			МассивИмени = ПараметрыURL[Имя];
		КонецЕсли;
		МассивИмени.Добавить(СтрокаСУстановленнымиЗначениямиПеременных(Стр.Значение, ТаблицаПеременных));
	КонецЦикла;

	УРЛЗапроса = СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.URLЗапроса, ТаблицаПеременных);

	Возврат URLДляИсполненияСЗакодированнымиПараметрами(УРЛЗапроса, ПараметрыURL);
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьПредварительныйURL(Форма, ИдентификаторСтрокиДерева)
	Форма.URLПредварительный = "";
	Если ИдентификаторСтрокиДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекСтрокаДерева = Форма.ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтрокиДерева);
	Если ТекСтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	Форма.URLПредварительный = URLДляИсполнения(ТекСтрокаДерева, Форма.Переменные)
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция РазделительСтрокДляЗапросаMultipart()
	Возврат Символы.ВК + Символы.ПС;
КонецФункции

&НаКлиенте
Функция ВозможноИсполнениеЗапроса(СтрокаЗапросов)
	Если Не СтрокаЗапросов.НаКлиенте Тогда
		Возврат Истина;
	КонецЕсли;	
	
	Если Не УИ_ОбщегоНазначенияКлиент.ЭтоВебКлиент() Тогда
		Возврат Истина;
	КонецЕсли;		
	
	Результат = Истина;

	Если Не УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.21") Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запросы в контексте веб-клиента доступны, начиная с версии платформы 8.3.21");
		Результат = Ложь;
	КонецЕсли;

	Если СтрокаЗапросов.ИспользоватьПрокси Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("В веб клиенте не поддерживается использование прокси в HTTP запросах");
		Результат = Ложь;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СтрокаЗаголовковПоТаблице(ТаблицаЗаголовков)
	МассивСтрокЗаголовков = Новый Массив;
	Для Каждого Стр Из ТаблицаЗаголовков Цикл
		Если Не Стр.Использование Тогда
			Продолжить;
		КонецЕсли;
		МассивСтрокЗаголовков.Добавить(Стр.Ключ + ":" + Стр.Значение);
	КонецЦикла;

	Возврат СтрСоединить(МассивСтрокЗаголовков, Символы.ПС);

КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ВидыКодировокТелаЗапроса()
	Виды = Новый Структура;
	Виды.Вставить("Авто", "Авто");
	Виды.Вставить("Системная", "Системная");
	Виды.Вставить("ANSI", "ANSI");
	Виды.Вставить("OEM", "OEM");
	Виды.Вставить("UTF8", "UTF8");
	Виды.Вставить("UTF16", "UTF16");
	
	
	Возврат Виды;
КонецФункции

&НаСервере
Процедура ЗаполнитьСписокВыбораКодировкиТекста()
	Элементы.КодировкаТелаЗапроса.СписокВыбора.Очистить();

	Виды = ВидыКодировокТелаЗапроса();
	Для Каждого КлючЗначение ИЗ Виды Цикл
		Элементы.КодировкаТелаЗапроса.СписокВыбора.Добавить(КлючЗначение.Значение);	
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьФорму()
	РазделительТелаМультипарт = "X-TOOLS-UI-1C-BOUNDARY";
	
	ЗаполнитьСписокВыбораКодировкиТекста();
	
	Элементы.ВидТелаЗапроса.СписокВыбора.Очистить();
	ВидыТелаЗапроса = ВидыТелаЗапроса();
	Элементы.ВидТелаЗапроса.СписокВыбора.Добавить(ВидыТелаЗапроса.БезТела, "Без тела");
	Элементы.ВидТелаЗапроса.СписокВыбора.Добавить(ВидыТелаЗапроса.Строка);
	Элементы.ВидТелаЗапроса.СписокВыбора.Добавить(ВидыТелаЗапроса.ДвоичныеДанные, "Двоичные данные");
	Элементы.ВидТелаЗапроса.СписокВыбора.Добавить(ВидыТелаЗапроса.Файл);
	Элементы.ВидТелаЗапроса.СписокВыбора.Добавить(ВидыТелаЗапроса.МультипартФорм, "Multipart form");

	ВидыHTTPМетодов = ВидыHTTPМетодов();
	Элементы.ЗапросHTTP.СписокВыбора.Очистить();
	Для Каждого КлючЗначение Из ВидыHTTPМетодов Цикл
		Элементы.ЗапросHTTP.СписокВыбора.Добавить(КлючЗначение.Значение);
	КонецЦикла;
	
	ВидыСтроковогоСодержимогоТела = ТипыТекстовогоСодержимого();
	Элементы.ДеревоЗапросовТипСтроковогоСодержимого.СписокВыбора.Очистить();
	Элементы.ДеревоЗапросовТипСтроковогоСодержимого.СписокВыбора.Добавить("Нет");
	Для Каждого КлючЗначение Из ВидыСтроковогоСодержимогоТела Цикл
		Элементы.ДеревоЗапросовТипСтроковогоСодержимого.СписокВыбора.Добавить(КлючЗначение.Ключ);
	КонецЦикла;
	
	Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Очистить();
	
	ВидыАутентификации = ВидыАутентификации();
	Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Добавить(ВидыАутентификации.Нет);
	Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Добавить(ВидыАутентификации.Базовая, "Базовая(Логин,Пароль)");
	Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Добавить(ВидыАутентификации.BearerToken, "Bearer Токен");
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.7") Тогда
		Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Добавить(ВидыАутентификации.NTML, "NTML (аутентифкация ОС)");
	КонецЕсли;
	Элементы.ДеревоЗапросовАутентификацияВид.СписокВыбора.Добавить(ВидыАутентификации.Базовая1С, "Базовая 1С(Логин,Пароль в HTTP соединении)");
	
	Элементы.ДеревоЗапросовТелоМультипартВид.СписокВыбора.Очистить();
	
	ВидыЭлементовТелаМультипарт = ВидыЭлементовМультипарт();
	Элементы.ДеревоЗапросовТелоМультипартВид.СписокВыбора.Добавить(ВидыЭлементовТелаМультипарт.Строка);
	Элементы.ДеревоЗапросовТелоМультипартВид.СписокВыбора.Добавить(ВидыЭлементовТелаМультипарт.Файл);
		
	ИнициализироватьТаблицыФормы();	

КонецПроцедуры


&НаСервере
Процедура ИнициализироватьДеревоЗапросов()
	ЭлементыДерева = ДеревоЗапросов.ПолучитьЭлементы();
	Если ЭлементыДерева.Количество() > 0 Тогда
		Возврат;
	КонецЕсли;
	
	НоваяСтрока = ЭлементыДерева.Добавить();
	ИнициализироватьСтрокуДереваЗапросов(НоваяСтрока, ЭтотОбъект);
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Процедура ИнициализироватьСтрокуДереваЗапросов(СтрокаДереваЗапросов, Форма)
	СтрокаДереваЗапросов.ЗапросHTTP = Форма.ВидыHTTPМетодов.GET;
	СтрокаДереваЗапросов.ВидТела = Форма.ВидыТелаЗапроса.БезТела;
	
	ВидыКодировокТелаЗапроса = ВидыКодировокТелаЗапроса();
	СтрокаДереваЗапросов.КодировкаТела = ВидыКодировокТелаЗапроса.Авто;
	
	СтрокаДереваЗапросов.Таймаут = 30;
	СтрокаДереваЗапросов.ТипСтроковогоСодержимого = "Нет";
	
	Если Не ЗначениеЗаполнено(СтрокаДереваЗапросов.Имя) Тогда
		СтрокаДереваЗапросов.Имя = "Запрос" + Формат(СтрокаДереваЗапросов.ПолучитьИдентификатор(), "ЧГ=0;");
	КонецЕсли;
	
	ВидыАутентификации = ВидыАутентификации();
	СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.Нет;
	
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьТаблицыПеременных()
	НаборыЗначенийПеременных.Очистить();
	Переменные.Очистить();
	
	НоваяСтрока = НаборыЗначенийПеременных.Добавить();
	ИнициализироватьСтрокуНаборПеременных(НоваяСтрока, ЭтотОбъект);
	
	ТекущийНаборЗначенийПеременных = НоваяСтрока.ПолучитьИдентификатор();
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьТаблицыФормы()
	ИнициализироватьДеревоЗапросов();
	ИнициализироватьТаблицыПеременных();
КонецПроцедуры


// Обновить заголовок формы.
&НаКлиенте
Процедура ОбновитьЗаголовок()

	Заголовок = НачальныйЗаголовок + ?(ИмяФайлаЗапросов <> "", ": " + ИмяФайлаЗапросов, "");

КонецПроцедуры


#КонецОбласти


&НаСервере
Процедура ЗаполнитьДвоичныеДанныеТелаИзФайлаЗавершениеНаСервере(Адрес, ИдентификаторСтроки)
	ТекДанные = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);

	ТекДанные.ТелоДвоичныеДанные = УИ_ОбщегоНазначения.ЗначениеХранилищаКонтейнераДвочныхДанных(ДвоичныеДанные);
	
	ТелоЗапросаДвоичныеДанныеСтрокой = ТекДанные.ТелоДвоичныеДанные.Представление;	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьДвоичныеДанныеТелаИзФайлаЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;

	ЗаполнитьДвоичныеДанныеТелаИзФайлаЗавершениеНаСервере(Адрес, ДополнительныеПараметры.ИдентификаторТекущейСтроки);

КонецПроцедуры

// Имя файла тела запроса начало выбора завершение.
// 
// Параметры:
//  ВыбранныеФайлы -Массив из Строка-Выбранные файлы
//  ДополнительныеПараметры - Структура:
//  * ИдентификаторСтроки -Число
&НаКлиенте
Процедура ИмяФайлаТелаЗапросаНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ВыбранныеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СтрокаЗапросов = ДеревоЗапросов.НайтиПоИдентификатору(ДополнительныеПараметры.ИдентификаторСтроки);
	Если СтрокаЗапросов = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаЗапросов.ИмяФайлаТела = ВыбранныеФайлы[0];
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоДаннымОтладки(АдресДанныхОтладки)
	ЭлементыДерева = ДеревоЗапросов.ПолучитьЭлементы();
	ЭлементыДерева.Очистить();
	
	НоваяСтрокаЗапроса = ЭлементыДерева.Добавить();
	ИнициализироватьСтрокуДереваЗапросов(НоваяСтрокаЗапроса, ЭтотОбъект);
	НоваяСтрокаЗапроса.Имя = "Отладка";
	
	ДанныеДляОтладки = ПолучитьИзВременногоХранилища(АдресДанныхОтладки);

	НоваяСтрокаЗапроса.URLЗапроса = "";
	Если Не ЗначениеЗаполнено(ДанныеДляОтладки.Протокол) Тогда
		НоваяСтрокаЗапроса.URLЗапроса = "http";
	Иначе
		НоваяСтрокаЗапроса.URLЗапроса = ДанныеДляОтладки.Протокол;
	КонецЕсли;

	НоваяСтрокаЗапроса.URLЗапроса = НоваяСтрокаЗапроса.URLЗапроса + "://" + ДанныеДляОтладки.АдресСервера;

	Если ЗначениеЗаполнено(ДанныеДляОтладки.Порт) Тогда
		ПортНестандартный = Истина;
		Если (Не ЗначениеЗаполнено(ДанныеДляОтладки.Протокол) Или ДанныеДляОтладки.Протокол = "http")
			 И ДанныеДляОтладки.Порт = 80 Тогда
			ПортНестандартный = Ложь;
		ИначеЕсли ДанныеДляОтладки.Протокол = "https" И ДанныеДляОтладки.Порт = 443 Тогда
			ПортНестандартный = Ложь;
		КонецЕсли;

		Если ПортНестандартный Тогда
			НоваяСтрокаЗапроса.URLЗапроса = НоваяСтрокаЗапроса.URLЗапроса + ":" + Формат(ДанныеДляОтладки.Порт, "ЧГ=0;");
		КонецЕсли;
	КонецЕсли;

	Если Не СтрНачинаетсяС(ДанныеДляОтладки.Запрос, "/") Тогда
		НоваяСтрокаЗапроса.URLЗапроса = НоваяСтрокаЗапроса.URLЗапроса + "/";
	КонецЕсли;

	НоваяСтрокаЗапроса.URLЗапроса = НоваяСтрокаЗапроса.URLЗапроса + ДанныеДляОтладки.Запрос;

	РедактированиеЗаголовковТаблицей = Истина;
	Элементы.ГруппаСраницыРедактированияЗаголовковЗапроса.ТекущаяСтраница = Элементы.ГруппаСтраницаРедактированияЗаголовковЗапросаТаблицей;

	Заголовки = ДанныеДляОтладки.Заголовки;

	//Удаляем неиспользуемые символы из строки заголовков
	ПозицияСимвола = НайтиНедопустимыеСимволыXML(Заголовки);
	Пока ПозицияСимвола > 0 Цикл
		Если ПозицияСимвола = 1 Тогда
			Заголовки = Сред(Заголовки, 2);
		ИначеЕсли ПозицияСимвола = СтрДлина(Заголовки) Тогда
			Заголовки = Лев(Заголовки, СтрДлина(Заголовки) - 1);
		Иначе
			НовыеЗаголовки = Лев(Заголовки, ПозицияСимвола - 1) + Сред(Заголовки, ПозицияСимвола + 1);
			Заголовки = НовыеЗаголовки;
		КонецЕсли;

		ПозицияСимвола = НайтиНедопустимыеСимволыXML(Заголовки);
	КонецЦикла;

	ЗаполнитьТаблицуЗаголовковПоСтроке(Заголовки, НоваяСтрокаЗапроса.Заголовки);
	ЗаполнитьТелоЗапросаПоДаннымОтладки(НоваяСтрокаЗапроса, ДанныеДляОтладки);
	ЗаполнитьАутентификацияПоДаннымОтладки(НоваяСтрокаЗапроса, ДанныеДляОтладки);

	Если ЗначениеЗаполнено(ДанныеДляОтладки.ПроксиСервер) Тогда
		НоваяСтрокаЗапроса.ИспользоватьПрокси = Истина;

		НоваяСтрокаЗапроса.ПроксиСервер = ДанныеДляОтладки.ПроксиСервер;
		НоваяСтрокаЗапроса.ПроксиПорт = ДанныеДляОтладки.ПроксиПорт;
		НоваяСтрокаЗапроса.ПроксиПользователь = ДанныеДляОтладки.ПроксиПользователь;
		НоваяСтрокаЗапроса.ПроксиПароль = ДанныеДляОтладки.ПроксиПароль;
		НоваяСтрокаЗапроса.ПроксиАутентификацияОС = ДанныеДляОтладки.ИспользоватьАутентификациюОС;
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТелоЗапросаПоДаннымОтладки(НоваяСтрокаЗапроса, ДанныеДляОтладки)

	Если ДанныеДляОтладки.ТелоЗапроса <> Неопределено Тогда
		Если НайтиНедопустимыеСимволыXML(ДанныеДляОтладки.ТелоЗапроса) = 0 Тогда
			НоваяСтрокаЗапроса.ВидТела = ВидыТелаЗапроса.Строка;
			НоваяСтрокаЗапроса.ТелоСтрокой = ДанныеДляОтладки.ТелоЗапроса;
			Возврат;
		КонецЕсли;
	КонецЕсли;

	Если ДанныеДляОтладки.Свойство("ДвоичныеДанныеТела") Тогда
		Если ТипЗнч(ДанныеДляОтладки.ДвоичныеДанныеТела) = Тип("ДвоичныеДанные") Тогда
			НоваяСтрокаЗапроса.ВидТела = ВидыТелаЗапроса.ДвоичныеДанные;
			НоваяСтрокаЗапроса.ТелоДвоичныеДанные = УИ_ОбщегоНазначения.ЗначениеХранилищаКонтейнераДвочныхДанных(ДанныеДляОтладки.ДвоичныеДанныеТела);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	Если ДанныеДляОтладки.Свойство("ИмяФайлаЗапроса") Тогда
		НоваяСтрокаЗапроса.ВидТела = ВидыТелаЗапроса.Файл;
		НоваяСтрокаЗапроса.ИмяФайлаТела = ДанныеДляОтладки.ИмяФайлаЗапроса;
		Возврат;
	КонецЕсли;

	НоваяСтрокаЗапроса.ВидТела = ВидыТелаЗапроса.БезТела;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьАутентификацияПоДаннымОтладки(НоваяСтрокаЗапроса, ДанныеДляОтладки)
	ВидыАутентификации = ВидыАутентификации();
	Если ДанныеДляОтладки.Свойство("СоединениеИспользоватьАутентификациюОС") Тогда
		Если ДанныеДляОтладки.СоединениеИспользоватьАутентификациюОС Тогда
			НоваяСтрокаЗапроса.АутентификацияВид = ВидыАутентификации.NTML;
			НоваяСтрокаЗапроса.АутентификацияИспользовать = Истина;
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	ИскомыйЗаголовок = "authorization";
	ЗначениеЗаголовкаАутентификации = "";
	
	Для Каждого Стр Из НоваяСтрокаЗапроса.Заголовки Цикл
		Если НРег(Стр.Ключ)	= ИскомыйЗаголовок Тогда
			ЗначениеЗаголовкаАутентификации = Стр.Значение;
			Прервать;
		КонецЕсли;	
	КонецЦикла;
	
	Если не ЗначениеЗаполнено(ЗначениеЗаголовкаАутентификации) Тогда
		Возврат;
	КонецЕсли;
	
	СтрокиЗначенияЗаголовка = СтрРазделить(ЗначениеЗаголовкаАутентификации, " ");
	Если СтрокиЗначенияЗаголовка.Количество() <2 Тогда
		Возврат;
	КонецЕсли;
	
	Схема = СтрокиЗначенияЗаголовка[0];
	Если НРег(Схема) = "basic" Тогда
		НоваяСтрокаЗапроса.АутентификацияВид = ВидыАутентификации.Базовая;
		НоваяСтрокаЗапроса.АутентификацияИспользовать = Истина;
		
		//@skip-check empty-except-statement
		Попытка
			СтрокаПользователя = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(СтрокиЗначенияЗаголовка[1]));
		Исключение
		КонецПопытки;
	
		МассивСтрокИмениПользователя = СтрРазделить(СтрокаПользователя, ":");
		НоваяСтрокаЗапроса.АутентификацияПользователь = МассивСтрокИмениПользователя[0];
		
		Если МассивСтрокИмениПользователя.Количество() >1 Тогда
			МассивСтрокИмениПользователя.Удалить(0);
			НоваяСтрокаЗапроса.АутентификацияПароль = СтрСоединить(МассивСтрокИмениПользователя,":");
		КонецЕсли;
	ИначеЕсли НРег(Схема) = "bearer" Тогда 
		НоваяСтрокаЗапроса.АутентификацияВид = ВидыАутентификации.BearerToken;
		НоваяСтрокаЗапроса.АутентификацияИспользовать = Истина;
		НоваяСтрокаЗапроса.АутентификацияПароль = СтрокиЗначенияЗаголовка[1];
	КонецЕсли;
КонецПроцедуры

// Редактировать тело запроса в редакторе JSONЗавершение.
// 
// Параметры:
//  Результат - Строка, Неопределено- Результат
//  ДополнительныеПараметры - Структура:
//  * ТекущаяСтрока - Число, Неопределено -
&НаКлиенте
Процедура РедактироватьТелоЗапросаВРедактореJSONЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ДополнительныеПараметры.ТекущаяСтрока = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	
	СтрокаДерева = ДеревоЗапросов.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока);
	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;

	СтрокаДерева.ТелоСтрокой=Результат;
	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "ТЕЛО", Результат);
	
	//ЗаполнитьСтруктуруJSONВДеревеЗапросов();
КонецПроцедуры


&НаСервере
Функция СгенерированныйКодИнициализацииHTTPСоединения(СтрокаДереваЗапросов, СтруктураURL)
	Если СтрокаДереваЗапросов.ИспользоватьПрокси Тогда
		ТекстНастройкаПрокси = СтрШаблон("ПроксиПротокол = %1;
										 |ПроксиСервер = %2;
										 |ПроксиПорт = %3;
										 |ПроксиПользователь = %4;
										 |ПроксиПароль = %5;
										 |ПроксиАутентификацияОС = %6;
										 |
										 |НастройкаПрокси = Новый ИнтернетПрокси(Истина);
										 |НастройкаПрокси.Установить(ПроксиПротокол,
										 |							ПроксиСервер,
										 |							ПроксиПорт,
										 |							ПроксиПользователь,
										 |							ПроксиПароль,
										 |							ПроксиАутентификацияОС);",
										 УИ_ГенераторКода.СтрокаВСтрокуКода(СтруктураURL.Схема),
										 УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.ПроксиСервер),
										 УИ_ГенераторКода.ЧислоВСтрокуКода(СтрокаДереваЗапросов.ПроксиПорт),
										 УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.ПроксиПользователь),
										 УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.ПроксиПароль),
										 УИ_ГенераторКода.БулевоВСтрокуКода(СтрокаДереваЗапросов.ПроксиАутентификацияОС));
	Иначе
		ТекстНастройкаПрокси = "НастройкаПрокси = " + УИ_ГенераторКода.НеопределеноВСтрокуКода() + ";";
	КонецЕсли;	
	
	Порт = УИ_ГенераторКода.НеопределеноВСтрокуКода();
	Если ЗначениеЗаполнено(СтруктураURL.Порт) Тогда
		Порт = УИ_ГенераторКода.ЧислоВСтрокуКода(СтруктураURL.Порт);
	КонецЕсли;	

	ВидыАутентификации = ВидыАутентификации();		
	ИспользоватьNTMLАутентификацию = Неопределено;
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше("8.3.7") Тогда
		Если СтрокаДереваЗапросов.АутентификацияИспользовать
			 И СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.NTML Тогда
			ИспользоватьNTMLАутентификацию = Истина;
		КонецЕсли;
	КонецЕсли;

	ЗащищенноеСоединение = УИ_ГенераторКода.НеопределеноВСтрокуКода();
	Если НРег(СтруктураURL.Схема) = "https" Тогда
		ЗащищенноеСоединение = "Новый ЗащищенноеСоединениеOpenSSL";
	КонецЕсли;
	
	Пользователь = УИ_ГенераторКода.НеопределеноВСтрокуКода();
	Пароль = УИ_ГенераторКода.НеопределеноВСтрокуКода();
	Если СтрокаДереваЗапросов.АутентификацияИспользовать
		 И СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.Базовая1С Тогда
		Пользователь = УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.АутентификацияПользователь);
		Пароль = УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.АутентификацияПароль);
	КонецЕсли;
	
	Если ИспользоватьNTMLАутентификацию = Неопределено Тогда
		ИспользоватьNTMLАутентификациюДляКода = УИ_ГенераторКода.НеопределеноВСтрокуКода();
		СоединениеHTTP = "Новый HTTPСоединение(Сервер, Порт, АутентификацияПользователь, АутентификацияПароль, НастройкаПрокси,Таймаут, ЗащищенноеСоединение)";
	Иначе
		ИспользоватьNTMLАутентификациюДляКода = УИ_ГенераторКода.БулевоВСтрокуКода(ИспользоватьNTMLАутентификацию);
		СоединениеHTTP = "Новый HTTPСоединение(Сервер, Порт, АутентификацияПользователь, АутентификацияПароль, НастройкаПрокси,Таймаут, ЗащищенноеСоединение, ИспользоватьNTMLАутентификацию)";
	КонецЕсли;

	ТекстИнициализацииHTTPСоединения =СтрШаблон("
												|Сервер = %1;
												|Порт = %2;
												|ИспользоватьNTMLАутентификацию = %3;
												|ЗащищенноеСоединение = %4;
												|Таймаут = %5;
												|													
												|АутентификацияПользователь = %6;
												|АутентификацияПароль = %7;
												|
												|СоединениеHTTP = %8;",
												УИ_ГенераторКода.СтрокаВСтрокуКода(СтруктураURL.Сервер),
												Порт,
												ИспользоватьNTMLАутентификациюДляКода,
												ЗащищенноеСоединение,
												УИ_ГенераторКода.ЧислоВСтрокуКода(СтрокаДереваЗапросов.Таймаут),
												Пользователь,
												Пароль,
												СоединениеHTTP);
	
	Возврат ТекстНастройкаПрокси+ТекстИнициализацииHTTPСоединения;
КонецФункции

&НаСервере
Функция СгенерированныйКодИнициализацииHTTPЗапроса(СтрокаДереваЗапросов, СтруктураURL)
	СтрокиДляОбъединения = Новый Массив;
	
	СтрокиДляОбъединения.Добавить(СтрШаблон("НовыйЗапрос = Новый HTTPЗапрос;
											|НовыйЗапрос.АдресРесурса = %1;
											|",
											УИ_ГенераторКода.СтрокаВСтрокуКода(УИ_КоннекторHTTP.УИ_СобратьАдресРесурса(СтруктураURL))));
	
	
	
	Для Каждого СтрокаЗаголовка Из СтрокаДереваЗапросов.Заголовки Цикл
		Если Не СтрокаЗаголовка.Использование Тогда
			Продолжить;
		КонецЕсли;

		СтрокиДляОбъединения.Добавить(СтрШаблон("НовыйЗапрос.Заголовки.Вставить(%1,%2);",
												УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЗаголовка.Ключ,
																															 Переменные)),
												УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЗаголовка.Значение,
																															 Переменные))));
	КонецЦикла;

	ВидыАутентификации = ВидыАутентификации();
	Если СтрокаДереваЗапросов.АутентификацияИспользовать
		 И ЗначениеЗаполнено(СтрокаДереваЗапросов.АутентификацияВид)
		 И СтрокаДереваЗапросов.АутентификацияВид <> ВидыАутентификации.Нет Тогда

		Если СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.Базовая Тогда
			СтрокиДляОбъединения.Добавить(СтрШаблон("
													|//Аутентификация базовая
													|АутентификацияПользователь = %1;
													|АутентификацияПароль = %2;
													|НовыйЗапрос.Заголовки.Вставить(""Authorization"", ""Basic ""+СтрЗаменить(ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(АутентификацияПользователь + "":""+ АутентификацияПароль)),Символы.ВК + Символы.ПС,""""));",
													УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПользователь,
																																 Переменные)),
													УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПароль,
																																 Переменные))));
		ИначеЕсли СтрокаДереваЗапросов.АутентификацияВид = ВидыАутентификации.BearerToken Тогда

			Префикс = СокрЛП(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПрефиксТокена,
																	   Переменные));
			Если Не ЗначениеЗаполнено(Префикс) Тогда
				Префикс = "Bearer";
			КонецЕсли;
			СтрокиДляОбъединения.Добавить(СтрШаблон("
													|//Аутентификация BearerToken
													|Токен = %1;
													|ПрефиксТокена = %2;
													|НовыйЗапрос.Заголовки.Вставить(""Authorization"", ПрефиксТокена +"" ""+Токен);",
													УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.АутентификацияПароль,
																																 Переменные)),
													УИ_ГенераторКода.СтрокаВСтрокуКода(Префикс)));
		КонецЕсли;

	КонецЕсли;

	СтрокиДляОбъединения.Добавить("
	|//Тело запроса");
	Если СтрокаДереваЗапросов.ВидТела = ВидыТелаЗапроса.БезТела Тогда
		СтрокиДляОбъединения.Добавить("//Без тела");
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = ВидыТелаЗапроса.Строка Тогда
		Если СтрокаДереваЗапросов.ИспользоватьBOM = 0 Тогда
			БОМ = "ИспользованиеByteOrderMark.Авто";
		ИначеЕсли (СтрокаДереваЗапросов.ИспользоватьBOM = 1) Тогда
			БОМ = "ИспользованиеByteOrderMark.Использовать";
		Иначе
			БОМ = "ИспользованиеByteOrderMark.НеИспользовать";
		КонецЕсли;

		СтрокиДляОбъединения.Добавить(СтрШаблон("//Тело строкой
												|ТелоЗапроса = %1;
												|ИспользованиеБОМ = %2;",
												УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.ТелоСтрокой,
																															 Переменные)),
												БОМ));

		Если СтрокаДереваЗапросов.КодировкаТела = "Авто" Тогда
			СтрокиДляОбъединения.Добавить("НовыйЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, , ИспользованиеБОМ);");
		Иначе
			Попытка
				//@skip-check module-unused-local-variable
				КодировкаТела = КодировкаТекста[СтрокаДереваЗапросов.КодировкаТела];
				СтрокиДляОбъединения.Добавить(СтрШаблон("КодировкаТела = КодировкаТекста.%1;",
														СтрокаДереваЗапросов.КодировкаТела));
			Исключение
				СтрокиДляОбъединения.Добавить(СтрШаблон("КодировкаТела = %1;",
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.КодировкаТела)));

			КонецПопытки;
			СтрокиДляОбъединения.Добавить("НовыйЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТела, ИспользованиеБОМ);");

		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = ВидыТелаЗапроса.ДвоичныеДанные Тогда
		Если СтрокаДереваЗапросов.ТелоДвоичныеДанные <> Неопределено Тогда
			ДвоичныеДанныеТела = УИ_ОбщегоНазначения.ЗначениеИзХранилищаКонтейнераДвоичныхДанных(СтрокаДереваЗапросов.ТелоДвоичныеДанные);
			Если ТипЗнч(ДвоичныеДанныеТела) = Тип("ДвоичныеДанные") Тогда
				СтрокаДвоичныхДанных = Base64Строка(ДвоичныеДанныеТела);
				СтрокиДляОбъединения.Добавить(СтрШаблон("//Тело ДвоичныеДанные
														|ТелоЗапроса = Base64Значение(%1);
														|НовыйЗапрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);",
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДвоичныхДанных)));

			КонецЕсли;
		КонецЕсли;
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = ВидыТелаЗапроса.Файл Тогда
		СтрокиДляОбъединения.Добавить(СтрШаблон("//Тело Файл
												|ТелоЗапроса = %1;
												|НовыйЗапрос.УстановитьИмяФайлаТела(ТелоЗапроса);",
												УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаДереваЗапросов.ИмяФайлаТела,
																															 Переменные))));
	ИначеЕсли СтрокаДереваЗапросов.ВидТела = ВидыТелаЗапроса.МультипартФорм Тогда
		ВидыЭлементовМультипарт = ВидыЭлементовМультипарт();
		
		СтрокиДляОбъединения.Добавить("//Тело МультипартДата
		|РазделительТелаМультипарт = ""---""+СтрЗаменить(Строка(Новый УникальныйИдентификатор), ""-"", """")+""---"";
		|
		|ФайлыДляОбъединения = Новый Массив;");	

		ЕстьФайлы = Ложь;
		Для ИндексСтроки = 0 По СтрокаДереваЗапросов.ТелоМультипарт.Количество() - 1 Цикл
			СтрокаЭлементаМультипарт = СтрокаДереваЗапросов.ТелоМультипарт[ИндексСтроки];
			Если Не СтрокаЭлементаМультипарт.Использование Тогда
				Продолжить;
			КонецЕсли;
			
			Если СтрокаЭлементаМультипарт.Вид = ВидыЭлементовМультипарт.Строка Тогда
				ЕстьФайлы = Истина;

				СтрокиДляОбъединения.Добавить(СтрШаблон("
														|ТекИмяПараметра = %1;
														|ТекЗначениеПараметра = %2;
														|
														|ПотокЗаписи = Новый ПотокВПамяти;
														|
														|ВходнойФайл = Новый ЗаписьТекста(ПотокЗаписи, КодировкаТекста.ANSI, Символы.ПС);
														|ВходнойФайл.ЗаписатьСтроку("""");
														|ВходнойФайл.ЗаписатьСтроку(""--"" + РазделительТелаМультипарт);
														|ВходнойФайл.ЗаписатьСтроку(""Content-Disposition: form-data;name=""""""+ТекИмяПараметра+"""""""");
														|ВходнойФайл.ЗаписатьСтроку("""");
														|ВходнойФайл.Закрыть();
														|ФайлыДляОбъединения.Добавить(ПотокЗаписи.ЗакрытьИПолучитьДвоичныеДанные());
														|
														|ФайлыДляОбъединения.Добавить(ПолучитьДвоичныеДанныеИзСтроки(ТекЗначениеПараметра));",
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Имя,
																																	 Переменные)),
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Значение,
																																	 Переменные))));

			ИначеЕсли СтрокаЭлементаМультипарт.Вид = ВидыЭлементовМультипарт.Файл Тогда
				Если Не ЗначениеЗаполнено(СтрокаЭлементаМультипарт.Значение) Тогда
					Продолжить;
				КонецЕсли;

				ЕстьФайлы = Истина;

				СтрокиДляОбъединения.Добавить(СтрШаблон("
														|ТекИмяПараметра = %1;
														|ТекИмяФайла = %2;
														|
														|Файл = Новый Файл(ТекИмяФайла);
														|ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ТекИмяФайла);
														|
														|ПотокЗаписи = Новый ПотокВПамяти;
														|
														|ВходнойФайл = Новый ЗаписьТекста(ПотокЗаписи, КодировкаТекста.ANSI, Символы.ПС);
														|ВходнойФайл.ЗаписатьСтроку("""");
														|ВходнойФайл.ЗаписатьСтроку(""--"" + РазделительТелаМультипарт);
														|ВходнойФайл.ЗаписатьСтроку(""Content-Disposition: form-data;name=""""""
														|													+ ТекИмяПараметра 
														|													+ """""";filename="""""" 
														|													+ Файл.Имя+ """""""");
														|ВходнойФайл.ЗаписатьСтроку(""Content-Type: application/octet-stream"");  
														|ВходнойФайл.ЗаписатьСтроку("""");
														|ВходнойФайл.Закрыть();
														|ФайлыДляОбъединения.Добавить(ПотокЗаписи.ЗакрытьИПолучитьДвоичныеДанные());
														|
														|ФайлыДляОбъединения.Добавить(ДвоичныеДанныеФайла);",
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Имя,
																																	 Переменные)),
														УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаСУстановленнымиЗначениямиПеременных(СтрокаЭлементаМультипарт.Значение,
																																	 Переменные))));
			КонецЕсли;

		КонецЦикла;
		
		Если ЕстьФайлы Тогда
			СтрокиДляОбъединения.Добавить("
			|ПотокЗаписи = Новый ПотокВПамяти;
			|ВходнойФайл = Новый ЗаписьТекста(ПотокЗаписи, КодировкаТекста.ANSI, Символы.ПС);
			|ВходнойФайл.ЗаписатьСтроку("""");
			|ВходнойФайл.ЗаписатьСтроку(""--"" + РазделительТелаМультипарт + ""--"");
			|ВходнойФайл.Закрыть();
			|
			|ФайлыДляОбъединения.Добавить(ПотокЗаписи.ЗакрытьИПолучитьДвоичныеДанные());
			|
			|ФинальныеДД = СоединитьДвоичныеДанные(ФайлыДляОбъединения);
			|
			|НовыйЗапрос.УстановитьТелоИзДвоичныхДанных(ФинальныеДД);
			|
			|НовыйЗапрос.Заголовки.Вставить(""Content-Type"", ""multipart/form-data; boundary=""+РазделительТелаМультипарт);
			|НовыйЗапрос.Заголовки.Вставить(""Content-Length"", XMLСтрока(ФинальныеДД.Размер()));
			|");
		КонецЕсли;

	КонецЕсли;

	Возврат СтрСоединить(СтрокиДляОбъединения, Символы.ПС);
	

	
КонецФункции

&НаСервере
Функция СгенерированныйКодИсполненияЗапроса(СтрокаДереваЗапросов)
	
	
	Возврат СтрШаблон("ВидЗапроса = %1;
					  |
					  |НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
					  |
					  |ОтветHTTP = СоединениеHTTP.ВызватьHTTPМетод(ВидЗапроса, НовыйЗапрос);
					  |ОкончаниеВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах();
					  |
					  |Длительность = ОкончаниеВыполнения - НачалоВыполнения;
					  |
					  |КодСостояния = ОтветHTTP.КодСостояния;
					  |ТелоОтветаСтрока = ОтветHTTP.ПолучитьТелоКакСтроку();
					  |ТелоОтветаДвоичныеДанные = ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
					  |", УИ_ГенераторКода.СтрокаВСтрокуКода(СтрокаДереваЗапросов.ЗапросHTTP));
КонецФункции

&НаСервере
Функция СгенерированныйКодИсполненияНаСервере(ИдентификаторСтроки)
	СтрокаДереваЗапросов = ДеревоЗапросов.НайтиПоИдентификатору(ИдентификаторСтроки);
	СтруктураURL = УИ_КоннекторHTTP.РазобратьURL(URLДляИсполнения(СтрокаДереваЗапросов, Переменные));
	
	
	ТекстИсполнения = УИ_ГенераторКода.СтандартныйЗаголовокСгенерированногоКода("Консоль HTTP запросов",
																				ИмяФайлаЗапросов,
																				СтрокаДереваЗапросов.Имя);

	ТекстИсполнения = ТекстИсполнения
					  + СгенерированныйКодИнициализацииHTTPСоединения(СтрокаДереваЗапросов, СтруктураURL)
					  + Символы.ПС
					  + СгенерированныйКодИнициализацииHTTPЗапроса(СтрокаДереваЗапросов, СтруктураURL)
					  + Символы.ПС
					  + СгенерированныйКодИсполненияЗапроса(СтрокаДереваЗапросов);
								
	Возврат ТекстИсполнения;
КонецФункции

//@skip-warning
&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяИнициализацияРедакторов()
	УИ_РедакторКодаКлиент.РедакторКодаОтложеннаяИнициализацияРедакторов(ЭтотОбъект);
КонецПроцедуры

// Подключаемый редактор кода завершение инициализации редактора.
// 
// Параметры:
//  ИдентификаторРедактора - Строка -Идентификатор редактора
&НаКлиенте 
Процедура Подключаемый_РедакторКодаЗавершениеИнициализацииРедактора(ИдентификаторРедактора) Экспорт
//	Если ИдентификаторРедактора <> "Код" Тогда
//		Возврат;
//	КонецЕсли;
//	Если ЗначениеЗаполнено(ИмяФайлаАлгоритма) Тогда
//		УИ_ОбщегоНазначенияКлиент.ПрочитатьДанныеКонсолиИзФайла("КонсольКода", СтруктураОписанияСохраняемогоФайла(),
//			Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект), Истина);
//	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяОбработкаСобытийРедактора() Экспорт
	УИ_РедакторКодаКлиент.ОтложеннаяОбработкаСобытийРедактора(ЭтотОбъект);
КонецПроцедуры



#КонецОбласти

